【问题标题】:SQL Query Dynamic Pivot with Dates (weeks) [duplicate]带有日期(周)的 SQL 查询动态枢轴 [重复]
【发布时间】:2020-03-11 03:00:44
【问题描述】:

我正在尝试构建一个查询,该查询将为我提供每周销售额的总和。唯一的方法是通过数据透视表。但是我面临的问题是如何使它动态化?因此,与其手动输入周数,我可以让它们自动更新吗?在下面的查询中,我有周 [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

【问题讨论】:

    标签: sql-server dynamic-pivot


    【解决方案1】:

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

             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()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多