sql – 计算组内的每个条件

前端之家收集整理的这篇文章主要介绍了sql – 计算组内的每个条件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于每个唯一的GroupId,我想得到每个IsGreen,IsRound,IsLoud条件和总行数的计数.

样品数据:

  1. -----------------------------------------------------
  2. id | ItemId | GroupId | IsGreen | IsRound | IsLoud
  3. ----+--------+---------+---------+---------+---------
  4. 1 | 1001 | 1 | 0 | 1 | 1
  5. 2 | 1002 | 1 | 1 | 1 | 0
  6. 3 | 1003 | 2 | 0 | 0 | 0
  7. 4 | 1004 | 2 | 1 | 0 | 1
  8. 5 | 1005 | 2 | 0 | 0 | 0
  9. 6 | 1006 | 3 | 0 | 0 | 0
  10. 7 | 1007 | 3 | 0 | 0 | 0

所期望的结果:

  1. ----------------------------------------------------------
  2. GroupId | TotalRows | TotalGreen | TotalRound | TotalLoud
  3. --------+-----------+------------+------------+-----------
  4. 1 | 2 | 1 | 2 | 1
  5. 2 | 3 | 1 | 0 | 1
  6. 3 | 2 | 0 | 0 | 0

我使用以下代码来创建表,我遇到的问题是,如果任何组没有与匹配组中没有出现在最终表中的条件之一的行.什么是完成我想做的最好的方法

  1. SELECT total.GroupId,total.[Count] AS TotalRows,IsGreen.[Count] AS TotalGreen,IsRound.[Count] AS TotalRound,IsLoud.[Count] AS TotalLoud
  2. FROM (
  3. SELECT GroupId,count(*) AS [Count]
  4. FROM TestData
  5. GROUP BY GroupId
  6. ) TotalRows
  7. INNER JOIN (
  8. SELECT GroupId,count(*) AS [Count]
  9. FROM TestData
  10. WHERE IsGreen = 1
  11. GROUP BY GroupId
  12. ) IsGreen ON IsGreen.GroupId = TotalRows.GroupId
  13. INNER JOIN (
  14. SELECT GroupId,count(*) AS [Count]
  15. FROM TestData
  16. WHERE IsRound = 1
  17. GROUP BY GroupId
  18. ) IsRound ON IsRound.GroupId = TotalRows.GroupId
  19. INNER JOIN (
  20. SELECT GroupId,count(*) AS [Count]
  21. FROM TestData
  22. WHERE IsLoud = 1
  23. GROUP BY GroupId
  24. ) IsLoud ON IsLoud.GroupId = TotalRows.GroupId

解决方法

您可以使用count来计算每个[GroupId]的行数,并对每个属性进行计数.
  1. select [GroupId],count([GroupId]) as [TotalRows],sum([IsGreen]) as [TotalGreen],sum([IsRound]) as [TotalRound],sum([IsLoud]) as [TotalLoud]
  2. from [TestData]
  3. group by [GroupId]

猜你在找的MsSQL相关文章