sql-server 计算每日记录并跨多个年度进行比较

2izufjch  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(127)

希望有人能给我指出正确的方向,因为我不擅长SQL,无法在网上找到我需要的东西。我有tblRegister,其中每天创建多个记录,现在需要比较多年中的每一天。
| 日期|标识符|
| - -|- -|
| 2010年1月1日|一个|
| 2010年1月1日|2个|
| 2010年1月1日|三个|
| 2010年1月2日|四个|
| 2010年1月3日|五个|
| 2010年1月3日|六个|
| ......直到今天|编号|
我正在努力研究如何查询数据,以便可以跨多年比较一年中的每一天(这样就可以在绘制图表时查看峰值/谷值趋势)
| 日期|二〇一〇年|二〇一一年|二〇一二年|......二零二二年|
| - -|- -|- -|- -|- -|
| 1月1日|三个|计数(id)|计数(id)|计数(id)|
| 1月2日|一个|计数(id)|计数(id)|计数(id)|
| 1月3日|2个|计数(id)|计数(id)|计数(id)|
| ......日历年的每个月日|计数(id)|计数(id)|计数(id)|计数(id)|
希望有人能帮忙谢谢。

dpiehjr4

dpiehjr41#

您可以构建一个动态的PIVOT,它考虑表中存在的所有年份,并为每个年份构建一列。

-- pick an arbitrary leap year, like 2020
DECLARE @leapyear char(4)       = '2020', 
        @cols     nvarchar(max) = N'';

SELECT @cols = STUFF
  ((SELECT N',' + QUOTENAME(YEAR(date))
    FROM dbo.[a table] 
    GROUP BY YEAR(date)
    ORDER BY YEAR(date)
    FOR XML PATH(N''), TYPE).value(N'.[1]', N'nvarchar(max)'), 
           1, 1, N'');

DECLARE @sql nvarchar(max) = N'SELECT date = CONVERT(char(6), 
    CONVERT(date, @ly + d), 106), ' + @cols + N' FROM 
(
  SELECT y = YEAR([date]), 
         d = RIGHT(CONVERT(char(8), date, 112), 4), 
         c = COUNT(id)
  FROM dbo.[a table]
  GROUP BY YEAR([date]), RIGHT(CONVERT(char(8), date, 112), 4)
) AS x PIVOT (MAX(c) FOR y IN (' + @cols + N')) p 
ORDER BY d;';

EXEC sys.sp_executesql @sql, N'@ly char(4)', @leapyear;

工作示例in this fiddle-假设您希望如何处理2月29日,该日期仅具有特定年份的值。

相关问题