Sql Pivot表返回多个空行,结果应分组在一行上
我在下面的表中查看透视图,以便第1列中的描述成为新透视图中的列标题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
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;