如何使用 SQL 查询将一个月的所有日期名称显示为一列以在报告中显示
How to show all day name of a month as a column using a SQL query to show that in a report
在创建一些报告时,我需要提出一个查询,该查询将月份和年份作为参数并给我一个结果,其中所有日期的名称都作为列。
例如:
我的想法是与我现有的数据集交叉连接并在报告中呈现。同样,如果有任何其他方法可以在 RDL 报告中显示此类数据,那也可以。
您可以使用 cte 递归 制作本月的日历 table。
datename
获取列名称。
day
获取月日数。
然后连接条件聚合函数 SQL 枢轴字符串。
final,动态 SQL 动态执行 SQL。
DECLARE @col AS NVARCHAR(MAX) ='',
@query AS NVARCHAR(MAX);
;WITH Calendar AS(
SELECT dateadd(month,datediff(month,0,getdate()),0) startdate,dateadd(month,datediff(month,0,getdate()),31) enddate
UNION ALL
SELECT startdate + 1 , enddate
FROM Calendar
WHERE startdate + 1 < enddate
), CalendarPivot as (
SELECT datename(weekday,startdate) dayname,
day(startdate) daynum
FROM Calendar
)
SELECT @col = @col + 'MAX(CASE WHEN daynum = '+cast(daynum as varchar(5))+' THEN daynum END) '+ dayname +','
FROM CalendarPivot t1
set @col = substring(@col,0,len(@col))
set @query = '
;WITH Calendar AS(
SELECT dateadd(month,datediff(month,0,getdate()),0) startdate,dateadd(month,datediff(month,0,getdate()),31) enddate
UNION ALL
SELECT startdate + 1 , enddate
FROM Calendar
WHERE startdate + 1 < enddate
), CalendarPivot as(
SELECT datename(weekday,startdate) dayname,
day(startdate) daynum
FROM Calendar
)
SELECT ' + @col + '
from CalendarPivot'
execute(@query)
注意
getdate()
可以更改为使用您的参数。
在创建一些报告时,我需要提出一个查询,该查询将月份和年份作为参数并给我一个结果,其中所有日期的名称都作为列。
例如:
我的想法是与我现有的数据集交叉连接并在报告中呈现。同样,如果有任何其他方法可以在 RDL 报告中显示此类数据,那也可以。
您可以使用 cte 递归 制作本月的日历 table。
datename
获取列名称。day
获取月日数。
然后连接条件聚合函数 SQL 枢轴字符串。
final,动态 SQL 动态执行 SQL。
DECLARE @col AS NVARCHAR(MAX) ='',
@query AS NVARCHAR(MAX);
;WITH Calendar AS(
SELECT dateadd(month,datediff(month,0,getdate()),0) startdate,dateadd(month,datediff(month,0,getdate()),31) enddate
UNION ALL
SELECT startdate + 1 , enddate
FROM Calendar
WHERE startdate + 1 < enddate
), CalendarPivot as (
SELECT datename(weekday,startdate) dayname,
day(startdate) daynum
FROM Calendar
)
SELECT @col = @col + 'MAX(CASE WHEN daynum = '+cast(daynum as varchar(5))+' THEN daynum END) '+ dayname +','
FROM CalendarPivot t1
set @col = substring(@col,0,len(@col))
set @query = '
;WITH Calendar AS(
SELECT dateadd(month,datediff(month,0,getdate()),0) startdate,dateadd(month,datediff(month,0,getdate()),31) enddate
UNION ALL
SELECT startdate + 1 , enddate
FROM Calendar
WHERE startdate + 1 < enddate
), CalendarPivot as(
SELECT datename(weekday,startdate) dayname,
day(startdate) daynum
FROM Calendar
)
SELECT ' + @col + '
from CalendarPivot'
execute(@query)
注意
getdate()
可以更改为使用您的参数。