如何在一列中使用COUNT()?

时间:2017-04-24 21:45:19

标签: tsql

假设我有3张桌子

Countries               ProvOrStates             MajorCities                   

-----+-------------     -----+-----------      -----+-------------
 Id  | CountryName       Id  | CId | Name       Id  | POSId | Name
-----+-------------     -----+-----------      -----+-------------
 1   | USA               1   | 1   | NY         1   |  1    | NYC

你如何得到像

这样的东西
 ---------------------------------------------
  CountryName | ProvinceOrState | MajorCities
              |   (Count)       |   (Count)
 ---------------------------------------------
    USA       |  50             | 200
 ---------------------------------------------
   Canada     | 10              | 57

到目前为止,我看到它的方式:

  • 国家加入 ProvOrStates 上运行第一个 SELECT COUNT GROUP BY Countries.Id ),
  • 将结果存储在表变量
  • ProvOrStates JOIN MajorCities 上运行第二个 SELECT COUNT GROUP BY Countries.Id ),
  • 根据Countries.Id
  • 更新表变量
  • 将表变量加入Countries表ON Countries.Id =表变量的Id。

是否有可能只运行一个查询而不是多个中间查询?我不知道它是否可行,因为我试过没有运气。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

使用子查询或派生表和视图

基本上如果你有3张桌子

select * from [TableOne] as T1
join
(
  select T2.Column, T3.Column
  from [TableTwo] as T2
  join [TableThree] as T3
  on T2.CondtionColumn = T3.CondtionColumn
) AS DerivedTable
on T1.DepName = DerivedTable.DepName

当你100%肯定它正在工作时,你可以创建一个包含你的三个表加入的视图,并在你想要的时候调用它

PS:如果列名相同或者收到此消息 "列' ColumnName'被多次指定为表格'。 " 您可以使用别名来解决此问题

答案 1 :(得分:0)

这个答案来自@lotzInSpace。

SELECT ct.[CountryName], COUNT(DISTINCT p.[Id]), COUNT(DISTINCT c.[Id])
FROM dbo.[Countries] ct
LEFT JOIN dbo.[Provinces] p
ON ct.[Id] = p.[CountryId]
LEFT JOIN dbo.[Cities] c
ON p.[Id] = c.[ProvinceId]
GROUP BY ct.[CountryName]

它在工作。我使用的是LEFT JOIN而不是INNER JOIN因为,如果一个国家没有省份,或省没有城市,那么该国家或省份不会; t显示。

再次感谢@lotzInSpace。