该请求的目标是获得每个代表在过去3年的月销售额表。它应该看起来像这样:
| 卖家ID|卖方|月| 2023 | 2022 | 2021 |
| --|--|--|--|--|--|
| 0001 |JohnSmith|一月| 0 | 2400 |1987.34|
| 0001 |JohnSmith|二月|二二一九点一七|2000.01| 2211.12|
| 0001 |JohnSmith|三月|1983.62| 2173.02| 2002.27|
| 0001 |JohnSmith|四月|一七四八点二一|小行星1943.21| 2203.82|
| 0001 |JohnSmith|可以|2083.62| 2073.77|二一零一点三九|
| 0002 |简·史密斯|一月|1684.02| 2400 |1987.34|
| 0002 |简·史密斯|二月|二四一九点一七|1900.01| 2221.12|
| 0002 |简·史密斯|三月|一八八三点六二|2273.02| 2012.27|
首先,基本的SQL请求是这样的:
select c.SELLER_ID, r.NAME as SELLER,
extract(year from c.DATE) as YEAR,
to_char(c.DATE, 'YYYY-MM') as MONTH,
to_char(c.DATE, 'Month') as MONTH_NAME,
sum(c.S_TOTAL) as MONTHLY_TOTAL
from SALE_HEADER c,
SALER r
where c.SELLER_ID=r.ID
and extract(year from c.DATE) between extract(year from sysdate) -2 and extract(year from sysdate)
group by SELLER_ID, r.NAME, extract(year from c.DATE), to_char(c.DATE, 'YYYY-MM'), to_char(c.DATE, 'Month'))
order by SELLER_ID, to_char(c.DATE, 'YYYY-MM')
它返回如下内容:
| 销售员ID| Saler|年|月|月份名称|每月总计|
| --|--|--|--|--|--|
| 0001 |JohnSmith| 2022 |2022-02 -02|二月|2000.01|
| 0001 |JohnSmith| 2023 |2023-02年|二月|二二一九点一七|
然后将其用作此透视查询中的子查询:
select SELLECR_ID, SELLER, substr(MONTH, 6,2) as MONTH, MONTH_NAME, "2021", "2022", "2023" from (
-- preceding query as a subquery
)
pivot (
sum(MONTHLY_TOTAL)
for YEAR in (
2021,
2022,
2023
)
)
group by SELLER_ID, SELLER, substr(MONTH, 6,2), MONTH_NAME, "2021", "2022", "2023"
order by SELLER_ID, substr(MONTH, 6,2)
它在单独的行上返回数据,如:
| 销售员ID| Saler|月|月份名称| 2023 | 2022 | 2021 |
| --|--|--|--|--|--|--|
| 0001 |JohnSmith| 02 |二月||2000.01||
| 0001 |JohnSmith| 02 |二月|二二一九点一七|||
为什么这两条线不在一条线上?
2条答案
按热度按时间yc0p9oo01#
为什么这两条线不在一条线上?
因为你是按月和年计算的。
您可以按月份进行聚合,然后使用条件聚合来获取月份的年份数据:
或:
其中,对于样本数据:
两个输出:
| 卖家ID|卖方|月|月份名称| 2023 | 2022 | 2021 |
| --|--|--|--|--|--|--|
| 0001 |JohnSmith| 01 |一月| 900 | 1000 | 200 |
| 0001 |JohnSmith| 02 |二月| 800 | 500 | 100 |
| 0001 |JohnSmith| 03 |三月| 700 | 300 | 0 |
| 0002 |简·史密斯| 01 |一月| 9000 | 10000 | 2000 |
| 0002 |简·史密斯| 02 |二月| 8000 | 5000 | 1000 |
| 0002 |简·史密斯| 03 |三月| 7000 | 3000 | 999 |
或:
或
两个输出:
| 卖家ID|卖方|月|月份名称|当前_年份|上一年|前一年2|
| --|--|--|--|--|--|--|
| 0001 |JohnSmith| 01 |一月| 900 | 1000 | 200 |
| 0001 |JohnSmith| 02 |二月| 800 | 500 | 100 |
| 0001 |JohnSmith| 03 |三月| 700 | 300 | 0 |
| 0002 |简·史密斯| 01 |一月| 9000 | 10000 | 2000 |
| 0002 |简·史密斯| 02 |二月| 8000 | 5000 | 1000 |
| 0002 |简·史密斯| 03 |三月| 7000 | 3000 | 999 |
fiddle
js4nwp542#
正如MT0所指出的,这是一个汇总问题。
最后,我提出了以下核心请求: