【问题标题】:Pivot table returns multiple rows with NULL, results should be grouped on one row数据透视表返回多行 NULL,结果应分组在一行上
【发布时间】:2015-01-09 03:56:52
【问题描述】:

我有下面的表格,我希望将其作为数据透视表,以便第 1 列中的描述成为新数据透视表中的列标题。

 Nominal Group  | GrpID | Description     | Value       | CustomerID
 ---------------+-------+-----------------+-------------+-----------
 Balance Sheet  | 7     | BS description  | 56973.10    |     2
 Cost of Sales  | 4     | COS description | 55950.17    |     2
 Sales          | 1     | Sales           | -178796.18  |     2
 Labour Costs   | 5     | Wages           | 18596.43    |     2
 Overheads      | 6     | Rent            | 47276.48    |     2

我正在使用下面的代码来获取下面的结果集:

select * from trialbalancegrouping 
PIVOT (Sum(value)
for nominalgroupname in ([Sales],[Cost of Sales],[Labour Costs],[Overheads])) AS PVTtable

-

 GrpID |  Description  | CustomerID |    Sales   | Cost of Sales | Labour Costs | Overheads
 ------+---------------+------------+------------+---------------+--------------+-----------
    1  |    Sales      |      2     | -178796.18 |     NULL      |      NULL    |     NULL
    2  |COS Description|      2     |    NULL    |   55950.17    |      NULL    |     NULL
    3  |    Labour     |      2     |    NULL    |     NULL      |   18596.43   |     NULL
    4  |   Overheads   |      2     |    NULL    |     NULL      |      NULL    |   47276.48

理想情况下,我希望每个客户输出一行,如下所示:

CustomerID |    Sales   |  Cost of Sales | Labour Costs | Overheads
-----------+------------+----------------+--------------+------------
     2     | -178796.18 |     55950.17   |   18596.43   |   47276.48

【问题讨论】:

  • 请给我表格结构

标签: sql sql-server group-by pivot


【解决方案1】:

任何可用的列都被传递给PIVOT 函数,所以除了聚合列和透视列之外的所有列都被隐式分组,所以由于存在GrpIDDescription,而不包括它被分组,因此每个组合都会得到一行。您需要使用子查询来限制传递给数据透视函数的列:

SELECT  pvt.CustomerID,
        pvt.Sales,
        pvt.[Cost of Sales],
        pvt.[Labour Costs],
        pvt.[Overheads]
FROM    (   SELECT  CustomerID, nominalgroupname, Value
            FROM    trialbalancegrouping
        ) AS t
        PIVOT
        (   SUM(Value)
            FOR nominalgroupname IN 
                (   [Sales],[Cost of Sales],
                    [Labour Costs],[Overheads]
                )
        ) AS pvt;

【讨论】:

  • 看起来不错 Gareth,我刚刚删除了子查询中的描述,现在可以根据需要引入尽可能多的客户详细信息。感谢您的帮助:)
  • 抱歉,子查询中应该是nominalgroupname ,而不是description
  • 没问题,它在 5 分钟内让我比在几个小时内走得更远!谢谢
猜你喜欢
  • 1970-01-01
  • 2016-01-10
  • 2012-03-12
  • 2015-01-31
  • 2013-11-15
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多