【问题标题】:SQL GROUP BY return single rowSQL GROUP BY 返回单行
【发布时间】:2018-01-19 20:42:50
【问题描述】:

我有以下 SQL 可以获取我需要的实际数据,但我希望每个“区域”有一行,列中包含 NULL、False 和 True 的计数。我可以在 SQL 语句中添加什么来使数据看起来像这样?

NullCount     FalseCount     TureCount     AreaName      AreaID
8              4             3             Capital Metro  1 
0              0             1             Great Lakes    3
9              4             6             Pacific        6

当前 SQL:

SELECT 
    tblRecyclingStatusRequests.ReturnUSM
    ,tblAreas.AreaID
    ,tblAreas.AreaName
    ,COUNT(ISNULL(tblRecyclingStatusRequests.ReturnUSM, 0)) AS CountOf
FROM            
    tblRecyclingStatusRequests INNER JOIN
    tblFacilities ON tblRecyclingStatusRequests.FacilityID =tblFacilities.FacilityID INNER JOIN
    tblDistricts ON tblFacilities.DistrictID = tblDistricts.DistrictID INNER JOIN
    tblAreas ON tblDistricts.AreaID = tblAreas.AreaID
GROUP BY tblRecyclingStatusRequests.ReturnUSM, tblAreas.AreaID, tblAreas.AreaNameCurrent

当前结果:

ReturnUSM   AreaID  AreaName        CountOf
NULL        1       Capital Metro   8
0           1       Capital Metro   3
1           1       Capital Metro   4
1           3       Great Lakes     1
NULL        6       Pacific         9
0           6       Pacific         4
1           6       Pacific         6

【问题讨论】:

  • 在表名上加上别名。长的列名很烦人。

标签: sql sql-server group-by


【解决方案1】:

条件聚合是一种方法:

SELECT MAX(CASE WHEN ReturnUSM IS NULL THEN CountOf ELSE 0 END) NullCount,
       MAX(CASE WHEN ReturnUSM = 0 THEN CountOf ELSE 0 END) FalseCount,
       MAX(CASE WHEN ReturnUSM = 1 THEN CountOf ELSE 0 END) TrueCount,
       AreaName,
       AreaID
FROM (YourCurrentQuery) a
GROUP BY AreaName,
         AreaID

有条件的SUM() 看起来也可以:

SELECT SUM(CASE WHEN RSR.ReturnUSM IS NULL THEN 1 ELSE 0 END) NullCount,
       SUM(CASE WHEN RSR.ReturnUSM = 0 THEN 1 ELSE 0 END) FalseCount,
       SUM(CASE WHEN RSR.ReturnUSM = 1 THEN 1 ELSE 0 END) TrueCount,
       A.AreaName,
       A.AreaID
FROM tblRecyclingStatusRequests RSR
INNER JOIN tblFacilities F ON RSR.FacilityID = F.FacilityID 
INNER JOIN tblDistricts D ON F.DistrictID = D.DistrictID 
INNER JOIN tblAreas A ON D.AreaID = A.AreaID
GROUP BY A.AreaID, A.AreaName

【讨论】:

  • 第一个效果很好。第二个在所有列中给我相同的数字,即 15/15/15、1/1/1、19/19/19
  • @RichP 我的错,应该是SUM() 而不是COUNT(),因为我说的是else 0else NULL 两者都适用。
【解决方案2】:

您可以使用 case 语句进行条件计数:

SELECT 
  count(case when tblRecyclingStatusRequests.ReturnUSM is null then 1 else null end) NullCount
  ,count(case when tblRecyclingStatusRequests.ReturnUSM=0 then 1 else null end) FalseCount
  ,count(case when tblRecyclingStatusRequests.ReturnUSM=1 then 1 else null end) TrueCount
  ,tblAreas.AreaID
  ,tblAreas.AreaName
  ,COUNT(ISNULL(tblRecyclingStatusRequests.ReturnUSM, 0)) AS CountOf
FROM            
  tblRecyclingStatusRequests INNER JOIN
  tblFacilities ON tblRecyclingStatusRequests.FacilityID =tblFacilities.FacilityID INNER JOIN
  tblDistricts ON tblFacilities.DistrictID = tblDistricts.DistrictID     
INNER JOIN
  tblAreas ON tblDistricts.AreaID = tblAreas.AreaID
GROUP BY tblAreas.AreaID,   tblAreas.AreaNameCurrent

【讨论】:

  • 很好地添加了总计 NULL + False + True 计数。感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多