【问题标题】:How to use COUNT() in more that one column?如何在多列中使用 COUNT()?
【发布时间】:2017-09-21 17:36:16
【问题描述】:

假设我有这 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

到目前为止,我的看法:

  • Countries JOIN ProvOrStates上运行第一个SELECT COUNTGROUP BY Country.Id),李>
  • 将结果存储在表变量中,
  • ProvOrStates JOIN MajorCities 上运行第二个 SELECT COUNT (GROUP BY Country.Id),李>
  • 根据 Country.Id 更新表变量
  • 将表变量与 Country 表连接起来 ON countries.Id = 表变量的 Id。

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

感谢您的帮助

【问题讨论】:

  • 将它们全部加入并选择 COUNTRY、COUNT(DISTINCT PROVINCE)、COUNT(DISTINCT CITY) GROUP BY COUNTRY
  • 您的解决方案有效。谢谢

标签: tsql


【解决方案1】:

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

基本上如果你有 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’列。” 你可以使用别名来解决这个问题

【讨论】:

  • 计数在哪里?
  • 您可以轻松地在此视图上运行您的计数或任何其他聚合或分组函数...我没有将其放入视图中的原因是为了使该视图可用于您可能使用的任何其他功能以后想用它
  • 这有助于我一次显示我想要的所有列。但是,我仍然不知道如何使用 SELECT col1, COUNT(col2), COUNT(col3) FROM ... 之类的东西。
  • 尝试使用 MyViewName.col2 和 COUNT(MyViewName.col2) 访问 col2
【解决方案2】:

这个答案来自@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,因为如果一个国家没有省份,或者一个省份没有城市,那么该国家或省份就不会显示。

再次感谢@lotzInSpace。

【讨论】:

  • 我的荣幸。如果我没有使用平板电脑,我会自己给你这个完整的答案。不过打字太多了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-12-18
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
相关资源
最近更新 更多