【问题标题】:SQL - Group by in PIVOT with variable columnsSQL - 在 PIVOT 中按变量列分组
【发布时间】:2015-07-28 01:42:20
【问题描述】:

我正在尝试按日期对输出进行分组。对于此表中的每个条目,每个唯一样式(N 种样式)都有订单详细信息行,其中包含订单日期和发货数量。我的目标是在每行中输出带有日期、样式和相关订单日期和发货总数的标题。现在,我为每个详细信息行而不是汇总行。我试过group by order_date, '+@PivotColumns+' 但这不起作用。我当然不能只做group by order_date。我是否需要对结果进行另一次查询?

DECLARE   @SQLQuery AS NVARCHAR(MAX)
DECLARE   @PivotColumns AS NVARCHAR(MAX)

SELECT   @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME(rtrim(style))
FROM (SELECT DISTINCT style FROM opendet where isnumeric(style)=1 and season='ESSENTIALS') AS stylepivot

SET   @SQLQuery = N'
select
order_date,'+@PivotColumns+'
FROM opendet
PIVOT(
 SUM(SHIP_QTY)
 FOR style IN ('+@PivotColumns+')
) AS P'

EXEC sp_executesql @SQLQuery

这就是我现在得到的:

order_date  15080   15082   15083   
2012-12-12  1       NULL    NULL
2012-12-13  NULL    1       NULL
2012-12-13  NULL    2       NULL
2012-12-14  NULL    NULL    1
2012-12-14  NULL    NULL    1
2012-12-15  NULL    NULL    NULL
2012-12-16  1       NULL    NULL
2012-12-16  4       NULL    NULL
2012-12-16  3       NULL    NULL

这就是我想要的:

order_date  15080   15082   15083   
2012-12-12  1       NULL    NULL
2012-12-13  NULL    3       NULL
2012-12-14  NULL    NULL    2
2012-12-15  NULL    NULL    NULL
2012-12-16  8       NULL    NULL

这里是源表的修剪摘录,(还有更多列):

order_date  style   season      ship_qty
2014-01-06  15082   ESSENTIALS  2.00
2014-01-06  15082   ESSENTIALS  1.00
2014-01-06  15082   ESSENTIALS  1.00
2014-01-06  15082   ESSENTIALS  2.00
2014-01-08  15080   ESSENTIALS  1.00
2014-01-08  15080   ESSENTIALS  1.00
2014-01-08  15080   ESSENTIALS  1.00
2014-01-08  15080   ESSENTIALS  1.00
2014-01-08  15082   ESSENTIALS  2.00
2014-01-08  15082   ESSENTIALS  2.00
2014-01-08  15082   ESSENTIALS  2.00

【问题讨论】:

  • 能否添加示例数据和预期结果
  • 完成。我在一开始就考虑添加它。
  • SQL fiddle 会让其他人更容易尝试和测试
  • 你的order_date字段是什么数据类型?
  • 另外,如果您不想在最终报告表中混合相应列,请不要忘记在@PivotColumns 构建查询中订购styles

标签: sql sql-server sql-server-2008


【解决方案1】:

我认为您只需要在枢轴之前预先聚合到样式/日期级别:

DECLARE   @SQLQuery AS NVARCHAR(MAX)
DECLARE   @PivotColumns AS NVARCHAR(MAX)

SELECT   @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME(rtrim(style))
FROM (SELECT DISTINCT style FROM opendet where isnumeric(style)=1 and season='ESSENTIALS') AS stylepivot

SET   @SQLQuery = N'
select
order_date,'+@PivotColumns+'
FROM (SELECT order_date,style, SUM(Ship_Qty) AS Ship_Qty
      FROM opendet
      GROUP BY order_date,style
      )sub
PIVOT(
 SUM(SHIP_QTY)
 FOR style IN ('+@PivotColumns+')
) AS P'

EXEC sp_executesql @SQLQuery

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2021-11-23
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多