构造SQL语句以检索相同/不同表中特定记录的count()

构造SQL语句以检索相同/不同表中特定记录的count(),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我以前问过一个关于这个的问题,但是我必须承认我对基于SQL的解决方案有偏见,现在我找不到这个问题,所以我会再试一次,仔细地表达它,并对提供的任何解决方案更加开放 我有两张桌子: tblCurrent Ref | CustomerID | ... .. .. . . | X001 X002 X003 tblHistorical Ref | ... .. .. . . | Missing | Matched X001 | ... .. .. . . | TRUE

我以前问过一个关于这个的问题,但是我必须承认我对基于SQL的解决方案有偏见,现在我找不到这个问题,所以我会再试一次,仔细地表达它,并对提供的任何解决方案更加开放

我有两张桌子:

tblCurrent 
 Ref  | CustomerID | ... .. .. .  . |
X001
X002
X003


tblHistorical 
 Ref   | ... .. .. .  . |  Missing | Matched
X001   | ... .. .. .  . |  TRUE    | FALSE
X001   | ... .. .. .  . |  FALSE   | FALSE
X002   | ... .. .. .  . |  TRUE    | TRUE
X002   | ... .. .. .  . |  TRUE    | FALSE
X003   | ... .. .. .  . |  FALSE   | FALSE
X003   | ... .. .. .  . |  TRUE    | TRUE
Ref在tblCurrent中是唯一的,但在Historical中不是唯一的

我如何构建一个基于tblCurrent的视图,该视图会产生三个额外的列,用于计算TBL历史记录中的记录数,即:

匹配Ref,Missing为TRUE

匹配Ref,Missing为False

匹配Ref,匹配为True

请注意,我需要添加额外的列,这些列根据类似的标准计算TBL历史记录中的记录数。

我认为您需要在这方面使用左连接,因为TBL历史记录表上可能不存在某些ref

SELECT R.Ref,
SUM(CASE WHEN H.Missing = TRUE THEN 1 ELSE 0 END) as MissingTrue,
SUM(CASE WHEN H.Missing = FALSE THEN 1 ELSE 0 END) as MissingFalse,
SUM(CASE WHEN H.Matched = TRUE THEN 1 ELSE 0 END) as MatchedTrue
FROM tblRef R JOIN tblHistorical H
ON R.Ref = H.Ref
我认为您需要在这个问题上使用左连接,因为TBL历史表上可能不存在ref


好主意,你的假设是正确的。上次我看到这种SQL时,我只是看到了随机垃圾,现在它似乎更清晰了,LMAO。感谢大家的输入。John,那么我如何才能在视图中添加一列来统计同一CustomerID???COUNTcustomerID.的tblCurrent表中的记录数。。这就是你想要的吗?不,因为如果我只添加CountCustomerID,它将计算所有记录。对于每一条记录,我想让它计算与该CustomerID和一些其他标准匹配的其他记录的数量,使其更有趣。对不起,我的错,请记住,您是按a.ref对记录进行分组的。如果每个ref都有一个且只有一个CustomerID,您如何计算客户?如果你真的想这样,你会在哪里显示客户数量?好的想法,你的假设是正确的。上次我看到这种SQL时,我只是看到了随机垃圾,现在它似乎更清晰了,LMAO。感谢大家的输入。John,那么我如何才能在视图中添加一列来统计同一CustomerID???COUNTcustomerID.的tblCurrent表中的记录数。。这就是你想要的吗?不,因为如果我只添加CountCustomerID,它将计算所有记录。对于每一条记录,我想让它计算与该CustomerID和一些其他标准匹配的其他记录的数量,使其更有趣。对不起,我的错,请记住,您是按a.ref对记录进行分组的。如果每个ref都有一个且只有一个CustomerID,您如何计算客户?如果你真的想要,你会在哪里显示客户的数量?
SELECT  a.ref,
        SUM(CASE WHEN b.Missing = 'True' THEN 1 ELSE 0 END) missingTrue,
        SUM(CASE WHEN b.Missing = 'False' THEN 1 ELSE 0 END) missingFalse,
        SUM(CASE WHEN b.Matched = 'True' THEN 1 ELSE 0 END) matchTrue
FROM    tblCurrent a
        LEFT JOIN tblHistorical b
            on a.ref = b.ref
GROUP BY a.ref
SELECT R.Ref,
SUM(CASE WHEN H.Missing = TRUE THEN 1 ELSE 0 END) as MissingTrue,
SUM(CASE WHEN H.Missing = FALSE THEN 1 ELSE 0 END) as MissingFalse,
SUM(CASE WHEN H.Matched = TRUE THEN 1 ELSE 0 END) as MatchedTrue
FROM tblRef R 
INNER JOIN tblHistorical H
ON R.Ref = H.Ref
Group by R.Ref
SELECT T.REF,
        COUNT(CASE WHEN H.MISSING = 'TRUE' THEN 1  END) AS MISSINGTRUE,
        COUNT(CASE WHEN H.MISSING = 'FALSE' THEN 1 END) AS MISSINGFALSE,
        COUNT(CASE WHEN H.MATCHED = 'TRUE' THEN 1  END) AS MATCHEDTRUE
FROM   TBLREF T 
JOIN   TBLHISTORICAL H
ON     R.REF = H.REF
GROUP BY T.REF