2016-06-29 109 views
1

我有以下查詢 -聚合列基於相同的數據

SELECT d.PRD_YY, 
     Count(*) 
FROM (SELECT CARD, 
       Min(TXN_DT) mindt 
     FROM db1.dbo.tblcards 
     GROUP BY CARD) a 
     JOIN db1.dbo.tlkpdates d 
     ON a.MINDT = d.GREG_DT 
WHERE d.PRD_YY = 2016 
     AND d.PRD_NBR = 5 
GROUP BY d.PRD_YY 

基本上,這告訴我如何從我的tblcards表多卡首次出現在從tlkpdates表採取在指定日期範圍從我的內部查詢結果加入mindt

我想要做的也是看看有多少張卡片在該日期範圍內出現,而不僅僅是第一次出現在該日期範圍內的卡片。

它似乎不可能,因爲我加入greg_dt(這只是一個正常的格里曆日期,如6/1/2016)在最短的日期,所以我怎麼可能加入最大日期最近發生的事情)?

我知道我可以讓另一個查詢返回相同的數據集,但我寧願讓它在同一個查詢中。

編輯 - 還有一點需要考慮的是,我要分組的不僅僅是PRD_YY--還有周期編號,週期周和週期日,以獲得更細粒度的視圖。

採樣數據 -

Card Date Store Transaction 
1-05-08 25 141414 
40999999999 2013-12-07 847 15154 
30999999998 2015-02-05 96 234235 
20999999997 2016-03-21 139 2342525 
50999999996 2016-03-30 659 1234121515 
70999999995 2016-03-04 659 52525 
50999999994 2016-03-03 907 2362362 
20999999993 2014-05-23 941 2623626 
70999999992 2013-12-03 18 123124 
40999999991 2014-01-18 107 1512515 

電流輸出

prd_yy new_cards 
2016 22911 

期望的輸出

prd_yy new_cards total_cards 
2016 22911 54992 
+2

您能否提供樣本數據,當前輸出和預期結果?我無法遵循你所描述的內容。 – Siyual

+1

當開發者使用諸如'tlkpdates'和'greg_dt'之類的神祕名字和縮寫時,我總是發現數據庫更令人興奮和有趣。它非常神祕。瞭解代碼被高估。 –

回答

1

假設card處於tblCards表一個PK(或至少僅出現一次每一天至多),我認爲這將適用於你想要做的事情:

SELECT 
    D.prd_yy, 
    SUM(CASE WHEN MD.card IS NOT NULL THEN 1 ELSE 0 END) AS new_cards, 
    COUNT(*) AS total_cards 
FROM 
    dbo.tlkpDates D 
INNER JOIN dbo.tblCards C ON C.txn_dt = D.greg_dt 
LEFT OUTER JOIN (SELECT card, MIN(txn_dt) AS min_dt FROM dbo.tblCards GROUP BY card) MD ON 
    MD.card = C.card AND MD.min_dt = C.txn_dt 
WHERE 
    D.prd_yy = '2016' AND 
    D.prd_nbr = 5 
GROUP BY 
    D.prd_yy 

在最短日期使用LEFT OUTER JOIN作爲該特定日是否爲「第一」的標誌。然後你可以使用SUM(CASE...)來獲得你的條件計數。