来自不同列的值的SQL计数
我有一只狗。每只狗都有来自不同列的值的SQL计数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一只狗。每只狗都有品种,可以有0到2张照片。我需要接收每个品种的所有狗的照片数量:带有BreedId和匹配photocount的表格。因此,结果表应为: BreedID|PhotosCount ------------------- 1 |3 ------------------- 2 |1 ------------------- 这应该可以做到: SELECT BreedID AS B, COUNT(Photo1) + COUNT(Photo2) AS C FROM
品种
,可以有0到2张照片。我需要接收每个品种的所有狗的照片数量:带有BreedId
和匹配photocount
的表格。因此,结果表应为:
BreedID|PhotosCount
-------------------
1 |3
-------------------
2 |1
-------------------
这应该可以做到:
SELECT BreedID AS B, COUNT(Photo1) + COUNT(Photo2) AS C
FROM Dog
GROUP BY BreedID
COUNT
聚合函数根本不考虑NULL
值。如果对于特定的BreedID
,Photo1
或Photo2
的所有值均为NULL
,则COUNT
返回0
,这应在单次扫描中起作用:
SELECT
BreedID,
SUM(CASE WHEN Photo1 IS NOT NULL THEN 1 ELSE 0 END)
+ SUM(CASE WHEN Photo2 IS NOT NULL THEN 1 ELSE 0 END) [Count]
FROM Table
GROUP BY BreedID
使用Photo1和Photo2的分组和求和: 注意:如果您想要每只狗的输出,您必须在group子句中包含DogId
;WITH T AS
(
SELECT
BreedId,
SUM (CASE ISNULL(Photo1,0) WHEN 1 THEN 1 ELSE 0 END) AS Photo1,
SUM (CASE ISNULL(Photo2,0) WHEN 1 THEN 1 ELSE 0 END) AS Photo2
FROM TableName
Group By BreedId
)
SELECT
BreedId,
SUM(Photo1+Photo2) AS TotalPhoto
FROM T
或者干脆
SELECT
BreedId,
SUM (CASE ISNULL(Photo1,0) WHEN 1 THEN 1 ELSE 0 END + CASE ISNULL(Photo2,0) WHEN 1 THEN 1 ELSE 0 END) AS TotalPhoto
FROM TableName
Group By BreedId
提示:GROUP BY,带有COUNT()。但是B列和C列从何而来?它们是狗的名字吗?是的,同时使用
COUNT
和ISNULL
是个坏主意NULL
值将在这种情况下计数,GROUP BY
两个字段也是错误的:)您只需检查上面的正确答案:)OP在要求中提到了每只狗和每个品种,但在示例中仅显示Breedy,所以我已经包含了dog并为其编写了注释
SELECT BreedID AS Breed, COUNT(Photo1) + COUNT(Photo2) AS #ofPhotos
FROM Dog
GROUP BY BreedID;