来自不同列的值的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;