Sql Pivot表返回多个空行,结果应分组在一行上

Sql Pivot表返回多个空行,结果应分组在一行上,sql,sql-server,group-by,pivot,Sql,Sql Server,Group By,Pivot,我在下面的表中查看透视图,以便第1列中的描述成为新透视图中的列标题 Nominal Group | GrpID | Description | Value | CustomerID ---------------+-------+-----------------+-------------+----------- Balance Sheet | 7 | BS description | 56973.10 | 2 Cost of Sales

我在下面的表中查看透视图,以便第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
-

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

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

所有可用的列都会传递给
PIVOT
函数,因此除了聚合的列之外,其他所有列和被透视的列都会隐式地按分组,因此由于
GrpID
Description
都存在,并且不包括在内,所以它会按分组,因此,对于这些组合,您会得到一行。您需要使用子查询来限制传递给pivot函数的列:

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分钟内得到的信息比我在几个小时内得到的信息还要多!谢谢
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;