您可以按照此查询作为示例。如前所述,正确添加列和表名。
DECLARE @sql NVARCHAR(MAX), @column NVARCHAR(MAX),@column0 NVARCHAR(MAX)
BEGIN
SELECT @column = COALESCE(@column+',', '')+QUOTENAME(wk)
FROM
(
SELECT DISTINCT
Delivery_Date wk (Your column which you are putting in pivot)
FROM TableName
WHERE Conditions (Conditions should be specific in order to get distinct items. This you need to check clearly)
) AS x;
SET @column0 = ''''+REPLACE(@column, ',', ''',''')+'''';
SET @sql = '
with cte as(
SELECT ColumnNames,Delivery_Date
FROM TableName
WHERE Conditions and Delivery_Date in ('+@column0+')
)
SELECT ColumnNames
'+@column+'
from cte
pivot
(
Sum(Quantity) FOR WK in ( '+@column+N')
)as PivotTable';
-- print @column ( in order to check which columns is going to be pivoted.
--select * from @sql
--PRINT @sql; (in order to check query is correct)
--exec sp_executesql @sql( In order to execute)
根据您的查询:-
DECLARE @sql NVARCHAR(MAX), @column NVARCHAR(MAX), @column0 NVARCHAR(MAX),
@mininterval int,@maxinterval int
set @mininterval=0
set @maxinterval=(whatever value you put in -ve)
while(@mininterval>@maxinterval)
BEGIN
SELECT @column = COALESCE(@column+',', '')+QUOTENAME(WK)
FROM
(
SELECT DISTINCT DATEPART(week,dateadd(week,@maxInterval,getdate())) AS WK
from (TableName and your where condition so that you get distinct week number)
) AS x
set @maxinterval=@maxinterval+1
end
SET @column0 = ''''+REPLACE(@column, ',', ''',''')+'''';
SET @sql ='
with cte as(
SELECT ITEM,sodetail.DESCRIPTION, QUANTITY,
YEAR (delivery_date) AS YR,
DATEPART (WEEK, delivery_date) AS WK,
DATEPART (WEEK, CURRENT_TIMESTAMP) AS CURR_WK
from sodetail
left join samaster on
sodetail.ITEM = samaster.CODE
left join soheader on
sodetail.ORDER_NO = soheader.ORDER_NO
where
DATEPART (WEEK, delivery_date) in ('+@column0+')
AND sodetail.STATUS <> 9
AND ITEM NOT LIKE ''''/%''''
AND DELIVERY_DATE >= CURRENT_TIMESTAMP - 600
AND ITEM = 49006
)
SELECT *,
'+@column+'
from cte
pivot
(
sum(Quantity) FOR Wk in ( '+@column+N')
)as PivotTable';
-- print @column
--select * from @sql
--PRINT @sql;
--EXEC SP_EXECUTESQL @SQL
我使用下面的查询来获取周数。
select DATEPART(week,dateadd(week,-1,getdate()))