要在用户输入的日期范围@Cols上创建sql数据透视。如何在过程中声明@fromDate、@toDate?日期是项目表上的一个字段

要在用户输入的日期范围@Cols上创建sql数据透视。如何在过程中声明@fromDate、@toDate?日期是项目表上的一个字段,sql,dynamic,parameters,pivot,Sql,Dynamic,Parameters,Pivot,我认为您需要使用date表从用户输入中获取所有日期,包括@fromDate和@toDate。您可以使用现有的时间表,也可以创建一个并使用表中的日期值来创建所需的列b/w from date和to date 下面附上一个示例代码 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(s

我认为您需要使用date表从用户输入中获取所有日期,包括@fromDate和@toDate。您可以使用现有的时间表,也可以创建一个并使用表中的日期值来创建所需的列b/w from date和to date

下面附上一个示例代码

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
拉小提琴

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