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