我有以下查询 -
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)");
}
答案 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...)
来获取条件计数。