首页 > 解决方案 > 想要在用户输入的日期范围 @Cols 上创建 sql Pivot。如何在程序中声明@fromDate、@toDate?日期是项目表上的一个字段

问题描述

select *
From
(
Select 
st.site_code
si.item_code
from c_item i
inner join c.item_code ic on i.item_key=ic.item_key

)PVT
Pivot
(Count(si.item_code)for [DATE] in [' + @Cols + ']P

标签: sqldynamicparameterspivot

解决方案


我认为您需要使用日期表从用户输入中获取所有@fromDate黑白日期。@toDate您可以使用现有的时间表或制作一个时间表并使用表中的日期值来创建从日期到日期的所需列。

下面附上示例代码。

create or alter procedure pivot_table_with_user_input
(
@from_Date varchar(10),
@to_Date varchar(10)
)
as
begin

DROP TABLE IF EXISTS [CalendarTable]
CREATE TABLE [CalendarTable]
(
    [CalendarDate] varchar(10)
)

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = (select dateadd(yy, -10, convert(varchar(10), GETDATE(), 121)))    --10 years back from the current date
SET @EndDate = DATEADD(yy, 10, @StartDate)                                          --10 years in the future from the current date

WHILE @StartDate <= @EndDate
BEGIN
    INSERT INTO [CalendarTable]
    SELECT convert(varchar(10), convert(date, @StartDate), 121)
               
    SET @StartDate = DATEADD(dd, 1, @StartDate)
END

declare @cols nvarchar(max) = ''
set @cols = STUFF(
                     (  select ',' + quotename(convert(varchar(10), t.CalendarDate))
                        from CalendarTable t
                        where t.CalendarDate between convert(date, @from_Date) and convert(date, @to_Date)
                        FOR XML PATH(''), TYPE
                     ).value('.', 'nvarchar(max)'), 1, 1, ''
                );

select @cols column_value   --check the dynamic columns


declare @sql nvarchar(max) = '
select site_code, '+@cols+'
From
(
    Select site_code,item_code, date_field
    from c_item
)PVT
Pivot
(
    Count(item_code)for date_field in ('+@cols+')
)P
'
print @sql

exec sp_executesql @sql

end

db<>小提琴链接


推荐阅读