2012-09-15 57 views
0

這與我最近詢問的另一個問題類似,但會更進一步。用SQL計算()特定記錄在另一個* AND *表中

我上一個問題問我如何用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 

裁判在tblCurrent獨一無二的,但不是歷史。

,我被告知,併成功得到了工作了前面的問題如下:

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 AND Resolved = False。
  • tblCurrent中匹配相同的記錄數CustomerID + Category + SubCategory(但不是當前記錄)AND Resolved = False。
+0

如果您可以根據您當前問題的數據給出示例輸出,那會更好 –

回答

1

試試這個:

SELECT a.ref, SUM(case when b.Missing ='True'THEN 1 ELSE 0 END)missingTrue, SUM(CASE when when b.Missing ='False'THEN 1 ELSE 0 END)missingFalse, SUM(CASE WHEN b.Matched ='真正的」 THEN ELSE 1 0 END)matchTrue, COUNT(DISTINCT a.CustomerID)作爲CustomerID_count - <添加此行 FROM tblCurrent一個 LEFT JOIN tblHistorical b 上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 
+0

Joe,不是那裏,我需要根據至少兩個字段CustomerID和Category來計算同一個表中的記錄數。第二列將做同樣的事情,但一個額外的標準領域。 – aSystemOverload

+0

@aSystemOverload:我已經更新了我的答案,請現在檢查.. –

0

添加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 
+0

我已經更新了我的描述並提供了更多詳細信息。我需要兩個計數列,他們都需要基於多個標準字段。檢查主要問題的細節。 – aSystemOverload

1

您可以通過CTE解決這個問題:

 
WITH tmp AS (
    SELECT CustomerId, COUNT(*) AS cnt 
    FROM tblCurrent) 
SELECT a.ref, tmp.cnt, ... 
FROM tblCurrent a 
LEFT JOIN tblHistorical b 
    ON a.ref = b.ref 
LEFT JOIN tmp 
    ON tmp.CustomerId = a.CustomerId 
... 
+0

布倫達,不是那裏,我需要能夠根據至少兩個字段,客戶ID和類別來統計同一個表中的記錄數。第二列將做同樣的事情,但一個額外的標準領域。感謝您的意見。 – aSystemOverload

+0

在我看完這個週末並與一位同事討論這個問題後,你可能確實是在正確的路線上,我只需要向tmp表添加其他字段/標準,謝謝。 – aSystemOverload

0

您可以在CASE語句中使用多個條件。所以你可以做「CASE WHEN a = b AND c = d THEN 1 ELSE 0 END」。這有幫助嗎?

+0

吉姆,不幸的是,我目前的問題是,兩個額外的列是基於tblCurrent(主表),所以試圖找出如何添加它們。 – aSystemOverload

相關問題