0

这类似于我最近提出的另一个问题,但更进一步。

我之前的问题询问了如何tblCurrent在从tblHistorical.

现在想知道如何做同样的事情,但要添加两个额外的列,这些列根据同一个tblCurrent表中的特定条件计算记录。

我有两张桌子:

tblCurrent 
 Ref  | CustomerID | Category | Subcategory | Resolved | ... .. .. .  . |
X001  | 001        | Sales  |  Major      |  TRUE  
X002  | 002        | Sales  | Minor      |  FALSE
X003  | 001        | Marketing | Corp      |  TRUE  


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 中不是。

我被建议并成功地为上一个问题解决了以下问题:

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

问:如何添加两个额外的列(到上述解决方案):

  • tblCurrent匹配相同的记录数CustomerID+ Category(但不是当前记录)AND Resolved=False。
  • tblCurrent匹配相同CustomerID+ Category+的记录数SubCategory(但不是当前记录)AND Resolved=False。
4

4 回答 4

1

您可以使用 CTE 解决此问题:

与 tmp 作为 (
   SELECT CustomerId, COUNT(*) AS cnt
   来自 tblCurrent)
选择 a.ref,tmp.cnt,...
FROM tbl当前
LEFT JOIN tblHistorical b
   ON a.ref = b.ref
左连接 tmp
   ON tmp.CustomerId = a.CustomerId
...
于 2012-09-15T16:25:05.067 回答
1

试试这个:

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 , COUNT(DISTINCT a.CustomerID) as CustomerID_count --< add this line FROM tblCurrent a LEFT JOIN tblHistorical b on a.ref = b.ref GROUP BY a.ref

编辑:

根据您更新的问题,如果我正确理解您的问题,

;WITH 
CATEGORY   AS 
        (SELECT CustomerID ,Category,COUNT(*) AS CNT
        FROM tblCurrent
        GROUP BY CustomerID ,Category),

SUBCATEGORY AS 
        (SELECT CustomerID ,Category,SubCategory,COUNT(*) AS CNT
        FROM tblCurrent
        GROUP BY CustomerID ,Category,SubCategory),

MAIN        AS (
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 M.* ,C.CNT AS CATEGORY_COUNT,
       S.CNT AS SUBCATEGORY_COUNT
FROM    MAIN M
JOIN    tblCurrent T
ON      M.ref=T.ref
JOIN    CATEGORY C
ON      C.CustomerID=T.CustomerID
AND     C.Category=T.Category
JOIN    SUBCATEGORY S
ON      S.CustomerID=T.CustomerID
AND     C.Category=T.Category
AND     S.SubCategory=T.SubCategory
于 2012-09-15T18:08:47.110 回答
0

将 a 添加COUNT(DISTINCT )到 tblCurrent 的唯一 ID - 即:

SELECT  a.ref, 
    COUNT(DISTINCT tblCurrent.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 
于 2012-09-15T16:18:49.433 回答
0

您可以在 CASE 语句中使用多个条件。所以你可以做“CASE WHEN a=b AND c=d THEN 1 ELSE 0 END”。这有帮助吗?

于 2012-09-15T21:23:01.450 回答