0

我正在尝试构建一个查询,该查询将为我提供每周的销售额总和。唯一的方法是通过数据透视表。但是我面临的问题是如何使它动态化?因此,与其手动输入周数,我可以让它们自动更新吗?在下面的查询中,我有周 [11]、[10]、[9]、[8]、[7]、[6]...- 有没有办法让周 [当前周]、[当前第 1 周]、[当前第 2 周]、[当前第 3 周]、[当前第 4 周]、[当前第 5 周]、[当前第 6 周] 等?

SELECT * FROM (
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
sodetail.STATUS <> '9'
AND ITEM NOT LIKE '/%'
AND DELIVERY_DATE >= CURRENT_TIMESTAMP - 600
AND ITEM = '49006'

)  t

PIVOT (
SUM (QUANTITY) 
FOR WK IN (

[11],[10],[9],[8],[7],[6],[5],[4],[3],[2],[1]
)

) AS PIVOT_TABLE

ORDER BY YR DESC
4

1 回答 1

0

您可以按照此查询作为示例。如前所述,正确添加列和表名。

         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()))
于 2020-03-11T06:51:24.823 回答