根据相同的数据聚合列

时间:2016-06-29 20:17:52

标签: sql join aggregate

我有以下查询 -

tblcards

基本上,这告诉我tlkpdates表格中的多少张卡片首先出现在mindt表格的给定日期范围内,方法是从我的内部查询结果加入greg_dt

我想要做的还是看到在该日期范围内出现了多少张牌,而不仅仅是那些首次出现在该日期范围内的牌。

这似乎不可能因为我在最短的约会时加入Card Date Store Transaction 10123131444 2014-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 (这只是正常的格里高利日期,如2016年6月1日),所以我怎么可能可能在最大日期(最近一次出现)加入?

我知道我可以让另一个查询返回相同的数据集,但我宁愿在相同的查询中使用它。

编辑 - 还需要考虑的是,我想要分组不仅仅是PRD_YY - 还有一个句号,周期和周期日,以便更细化图。

样本数据 -

prd_yy  new_cards
2016    22911

当前输出

prd_yy  new_cards   total_cards
2016    22911   54992

期望的输出

import java.math.BigDecimal;
import org.apache.commons.validator.routines.*;

BigDecimalValidator currencyValidator = CurrencyValidator.getInstance();
BigDecimal parsedCurrency = currencyValidator.validate(currencyString);
if ( parsedCurrency == null ) {
        throw new Exception("Invalid currency format (please also ensure it is UTF-8)");
}

1 个答案:

答案 0 :(得分: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...)来获取条件计数。