0

これは私が最近尋ねた別の質問に似ていますが、もう少し先です。

tblCurrent以前の質問で、 から特定の関連レコードの数を取得しながら、 でビューを構築する方法を尋ねましたtblHistorical

同じことを行う方法を知りたいのですtblCurrentが、同じテーブルの特定の基準に基づいてレコードをカウントする 2 つの列を追加する必要があります。

私は2つのテーブルを持っています:

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

Q: カウントする 2 つの列を (上記のソリューションに) 追加するにはどうすればよいですか?

  • 同じ+ (ただし現在のレコードではない)tblCurrentに一致し、かつ解決済み = Falseのレコードの数。CustomerIDCategory
  • 同じ+ + (ただし現在のレコードではない)tblCurrentに一致するレコードの数AND 解決済み = False。CustomerIDCategorySubCategory
4

4 に答える 4

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)asCustomerID_count-<この行を追加しますFROMtblCurrenta 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 に答える
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
左結合 tmp
   ON tmp.CustomerId = a.CustomerId
...
于 2012-09-15T16:25:05.067 に答える
0

CASEステートメントでは複数の条件を使用できます。したがって、「a = b AND c = d THEN 1ELSE0ENDの場合」を実行できます。それは役に立ちますか?

于 2012-09-15T21:23:01.450 に答える
0

tblCurrent の一意の ID にa を追加しCOUNT(DISTINCT )ます。つまり:

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 に答える