我有一个表,其中每个位置都有一个不同计费代码下的交易,如果在一年中的某个特定月份有一个计费代码下的交易,并且如果计费代码在下个月停止使用,则最终交易表应包含新的计费代码以及未来12个月的停止使用的计费代码(YTD交易)
输入表如下所示
| 年份|位置ID|月份|发票ID|代码|金额1|本年累计金额|
| - -|- -|- -|- -|- -|- -|- -|
| 小行星2021|小行星6394|一个|一百零一|F级|一个|一个|
| 小行星2021|小行星6394|一个|一百零一|G级|10个|10个|
| 小行星2021|小行星6394| 2个|一百零二|F级|2个|三个|
| 小行星2021|小行星6394|三个|一百零三|F级|三个|六个|
| 小行星2021|小行星6394|四个|一百零四|F级|四个|10个|
| 小行星2021|小行星6394|五个|一百零五|F级|五个|十五个|
| 小行星2021|小行星6394|六个|一百零六个|F级|2个|十七岁|
| 小行星2021|小行星6394|六个|一百零六个|G级|一个|十一|
| 小行星2021|小行星6394|七个|一百零七|F级|2个|十九个|
| 小行星2021|小行星6394|八个|一百零八|F级|三个|二十二个|
| 小行星2021|小行星6394|九个|一百零九|F级|一个|二十三个|
| 小行星2021|小行星6394| 10个|小千十|F级|2个|二十五个|
| 小行星2021|小行星6394|十一|小行星10| F级|一个|二十六人|
| 小行星2021|小行星6394|十二个|小行星10| F级|三个|二十九人|
我的预期输出是
| 年份|位置ID|月份|发票ID|代码|金额1|本年累计金额|
| - -|- -|- -|- -|- -|- -|- -|
| 小行星2021|小行星6394|一个|一百零一|F级|一个|一个|
| 小行星2021|小行星6394|一个|一百零一|G级|10个|10个|
| 小行星2021|小行星6394| 2个|一百零二|F级|2个|三个|
| 小行星2021|小行星6394| 2个|一百零二|G级|第0页|10个|
| 小行星2021|小行星6394|三个|一百零三|F级|三个|六个|
| 小行星2021|小行星6394|三个|一百零三|G级|第0页|10个|
| 小行星2021|小行星6394|四个|一百零四|F级|四个|10个|
| 小行星2021|小行星6394|四个|一百零四|G级|第0页|10个|
| 小行星2021|小行星6394|五个|一百零五|F级|五个|十五个|
| 小行星2021|小行星6394|五个|一百零五|G级|第0页|10个|
| 小行星2021|小行星6394|六个|一百零六个|F级|2个|十七岁|
| 小行星2021|小行星6394|六个|一百零六个|G级|一个|十一|
| 小行星2021|小行星6394|七个|一百零七|F级|2个|十九个|
| 小行星2021|小行星6394|七个|一百零七|G级|第0页|十一|
| 小行星2021|小行星6394|八个|一百零八|F级|三个|二十二个|
| 小行星2021|小行星6394|八个|一百零八|G级|第0页|十一|
| 小行星2021|小行星6394|九个|一百零九|F级|一个|二十三个|
| 小行星2021|小行星6394|九个|一百零九|G级|第0页|十一|
| 小行星2021|小行星6394| 10个|小千十|F级|2个|二十五个|
| 小行星2021|小行星6394| 10个|小千十|G级|第0页|十一|
| 小行星2021|小行星6394|十一|小行星10| F级|一个|二十六人|
| 小行星2021|小行星6394|十一|小行星10| G级|第0页|十一|
| 小行星2021|小行星6394|十二个|小行星10| F级|三个|二十九人|
| 小行星2021|小行星6394|十二个|小行星10| G级|第0页|十一|
我试过这个
WITH temp1 AS
(select year,invoiceID,locationID,count(1)
FROM InputTable
GROUP BY year, invoiceID,ocationID HAVING count(1)=1)
,
temp2 AS
( SELECT * FROM InputTable
WHERE concat(year,'_',invoiceID,'_',locationID) in
( SELECT concat(b.year, '_',b.invoiceID,'_',b.locationID) FROM InputTable b
GROUP BY b.year, b.invoiceID, b.locationID
HAVING count (1)>1
)
)
SELECT DISTINCT
c.year,
CASE WHEN c.code=d.code THEN c.post_date_month ELSE c.post_date_month END AS post_date_month,
c.invoiceID,
CASE WHEN c.code=d.code THEN c.locationID ELSE d.locationID END AS locationID,
CASE WHEN c.code=d.code THEN c.code ELSE d.code END AS code,
CASE WHEN c.code=d.code THEN c.base_amount ELSE d.base_amount END AS base_amount,
CASE WHEN c.code=d.code THEN c.base_amount_ytd ELSE d.base_amount_ytd END AS base_amount_ytd
FROM (
SELECT DISTINCT b.*
FROM temp1 a
INNER JOIN InputTable b
ON a.year=b.year AND a.invoiceID=b.invoiceID AND a.locationID=b.locationID
) c
LEFT JOIN temp2 d
ON 1=1
;
1条答案
按热度按时间46qrfjad1#
首先,您需要在构建“新”行的cte中COUNT(*)为1的所有行,并将其与现有行联合。
根据您的示例,我已经构建了CTE,它符合您的数据,但您需要使CTE适应您的需求