2016-06-29 2 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 (или, по крайней мере, появляется только один раз каждый максимум дня), я думаю, что это сработает для того, что вы пытаетесь сделать:

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...), чтобы получить свой условный счет.

Смежные вопросы