我有一个视图,其中包含下图中看到的数据。
该视图向我显示了当前财政年度每个月有多少个工作日,不带任何学校/银行假期。
由于八月份有零天,因此从视图中排除了该月份。
由于8月份的可用天总数始终为零,因此将SQL硬编码为8月份始终为0似乎是可以接受的,4月至8月的记录也与4月至7月相同。
添加这两个记录的最佳方法是什么,以及将其放置在代码中的哪个位置,请参见代码布局示例:
请参阅链接(回答问题)以获取代码布局:
SQL populate total working days per month minus bank holidays for current financial year
最佳答案
对于我的答案,我假设您有一个视图vDays
,其中的列与您的屏幕截图相匹配:period
,availabledays
,year
。
要将任何零天时间段添加到结果中,无论哪个月份可能为零(它将满足8月以及恰好为零天的任何其他月份),您都可以像这样扩展视图:
WITH Mths (Mth) AS (
SELECT 'January'
UNION SELECT 'February'
UNION SELECT 'March'
UNION SELECT 'April'
UNION SELECT 'May'
UNION SELECT 'June'
UNION SELECT 'July'
UNION SELECT 'August'
UNION SELECT 'September'
UNION SELECT 'October'
UNION SELECT 'November'
UNION SELECT 'December'
UNION SELECT 'April - January'
UNION SELECT 'April - February'
UNION SELECT 'April - March'
UNION SELECT 'April - May'
UNION SELECT 'April - June'
UNION SELECT 'April - July'
UNION SELECT 'April - August'
UNION SELECT 'April - September'
UNION SELECT 'April - October'
UNION SELECT 'April - November'
UNION SELECT 'April - December'
), Years (Year) AS (
SELECT DISTINCT year
FROM vDays
), ZeroPeriods (Mth, Years) AS (
SELECT Mth, Year
FROM Mths, Years
), JoinedData (Mth, AvailableDays, Year) AS (
SELECT Mth, 0, Years
FROM ZeroPeriods
UNION ALL
SELECT period, availabledays, year
FROM vDays
), GroupedData (Mth, AvailableDays, Year) AS (
SELECT Mth, SUM(AvailableDays), Year
FROM JoinedData
GROUP BY Mth, Year
)
SELECT *
FROM GroupedData
ORDER BY Year, CASE UPPER(LEFT(Mth, 3))
WHEN 'JAN' THEN 1 WHEN 'FEB' THEN 2 WHEN 'MAR' THEN 3
WHEN 'APR' THEN 4 WHEN 'MAY' THEN 5 WHEN 'JUN' THEN 6
WHEN 'JUL' THEN 7 WHEN 'AUG' THEN 8 WHEN 'SEP' THEN 9
WHEN 'OCT' THEN 10 WHEN 'NOV' THEN 11 ELSE 12 END;
我已经将其拆分为许多单独的查询,尽管有些可以合并为子查询,但是这样做可以使理解变得更加清晰。
关于sql - SQL Server将记录记录手动添加到 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9277628/