如何显示分组依据查询中的子元素计数-透视

时间:2018-08-08 14:46:00

标签: sql-server tsql

我们有汽车表。 它有字幕:

  • 日产
  • 丰田
  • 宝马

我们有城市:

  • 纽约
  • 洛杉矶
  • 达拉斯

表格:

  • 编号
  • 马克
  • CityId

这3个城市拥有25万辆汽车。

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

这是我的查询

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 |
+-------------+--------+--------+

1 个答案:

答案 0 :(得分:0)

您可以使用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 

结果:

enter image description here

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