2016-06-29 9 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 

所望の出力

cardはtblCardsテーブルにPKである(または少なくとも一度だけそれぞれ表示されていることを仮定
prd_yy new_cards total_cards 
2016 22911 54992 
+2

サンプルデータ、現在の出力、および予想される結果を提供してください。私は、あなたが描写していることに従うのが難しいです。 – Siyual

+1

開発者が 'tlkpdates'や' greg_dt'のような暗黙の名前と略語を使うと、データベースはずっと面白くて面白いです。それはずっと神秘的です。コードの理解は過大評価されています。 –

答えて

1

日)、私はこれがあなたがやろうとしているもののために動作すると思う:

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...)でそれを使用して条件付きカウントを得ることができます。