首页 > 解决方案 > 如何在 Group By 查询中显示子元素的数量 - Pivoted

问题描述

我们有汽车桌。它有品牌:

我们有城市:

桌子:

它拥有 3 个城市的全部 250 000 辆汽车。

我们如何显示它们按城市和计数分组,但城市是列。

这是我的查询:

SELECT Count(veh.id) [Count],pd.District, vet.Name  FROM Vehicles veh

INNER JOIN PostalDistricts pd on pd.Id = veh.PostalDistrictId
INNER JOIN VehicleMarqueId vet on vet.id = veh.VehicleMarqueId

GROUP BY pd.District, vet.Name

ORDER BY Count(veh.id) DESC, pd.District asc

但结果是:

+-------+-------------+--------+
| Count |    City     | Marque |
+-------+-------------+--------+
|  9547 | New York    | Toyota |
|  3509 | Dallas      | Toyota |
|  2608 | Los Angeles | Toyota |
|  2545 | New York    | Nissan |
|  2107 | Dallas      | Nissan |
|  1780 | Los Angeles | Nissan |
+-------+-------------+--------+

预期是:

+-------------+--------+--------+
|    City     | Toyota | Nissan |
+-------------+--------+--------+
| Dallas      |   3509 |   2107 |
| Los Angeles |   2608 |   1780 |
| New York    |   9547 |   2545 |
+-------------+--------+--------+

标签: sql-servertsql

解决方案


您可以使用以下pivot语句:

declare @tmp table ([count] int , City varchar(50), Marque nvarchar(50))

insert into @tmp values
 (9547, 'New York', 'Toyota')
,(3509, 'Dallas', 'Toyota')
,(2608, 'Los Angeles', 'Toyota')
,(2545, 'New York', 'Nissan')
,(2107, 'Dallas', 'Nissan')
,(1780, 'Los Angeles', 'Nissan')

select * from @tmp
pivot 
( 
    max([count]) 
    for Marque in ([Toyota], [Nissan] ) 
) piv 

结果:

在此处输入图像描述

但是,如果Marque列中有更多值,则必须使用动态 TSQL 生成所需的所有列


推荐阅读