我创建了一个查询,以检索特定部门在特定年份的销售额、特定国家和年份的所有部门的销售额,以及特定国家部门销售额与销售额的百分比。我需要计算上一年和本年度的百分比之间的差异(1998年为1999年,1999年为2000年等)。)。
Americas 1999 Direct Sales 7932550.86 12464862.43 63.64%
Americas 1999 Internet 1377051.66 12464862.43 11.05%
Americas 1999 Partners 3155259.91 12464862.43 25.31%
Asia 1999 Direct Sales 1369875.55 2395268.48 57.19%
Asia 1999 Internet 285153.52 2395268.48 11.90%
Asia 1999 Partners 740239.41 2395268.48 30.90%
Europe 1999 Direct Sales 4755014.09 6502887.40 73.12%
Europe 1999 Internet 511273.40 6502887.40 7.86%
Europe 1999 Partners 1236599.91 6502887.40 19.02%
Americas 2000 Direct Sales 7967141.89 13788324.32 57.78%
Americas 2000 Internet 1162343.86 13788324.32 8.43%
Americas 2000 Partners 4658838.57 13788324.32 33.79%
Asia 2000 Direct Sales 1242257.78 2343114.67 53.02%
Asia 2000 Internet 242492.77 2343114.67 10.35%
Asia 2000 Partners 858364.12 2343114.67 36.63%
Europe 2000 Direct Sales 4493735.78 6737500.98 66.70%
Europe 2000 Internet 415135.09 6737500.98 6.16%
Europe 2000 Partners 1828630.11 6737500.98 27.14%
该表包括1999年至2000年的资料。
前几年的第二个:
Americas 1998 Direct Sales 8340188.74 13468418.60 61.92%
Americas 1998 Internet 1714392.70 13468418.60 12.73%
Americas 1998 Partners 3155712.64 13468418.60 23.43%
Americas 1998 Tele Sales 258124.52 13468418.60 1.92%
Asia 1998 Direct Sales 1409654.80 2468506.67 57.11%
Asia 1998 Internet 320522.72 2468506.67 12.98%
Asia 1998 Partners 734810.33 2468506.67 29.77%
Asia 1998 Tele Sales 3518.82 2468506.67 .14%
Europe 1998 Direct Sales 5101419.96 7102517.23 71.83%
Europe 1998 Internet 686048.60 7102517.23 9.66%
Europe 1998 Partners 1301521.63 7102517.23 18.32%
Europe 1998 Tele Sales 13527.04 7102517.23 .19%
Americas 1999 Direct Sales 7932550.86 12464862.43 63.64%
Americas 1999 Internet 1377051.66 12464862.43 11.05%
Americas 1999 Partners 3155259.91 12464862.43 25.31%
Asia 1999 Direct Sales 1369875.55 2395268.48 57.19%
Asia 1999 Internet 285153.52 2395268.48 11.90%
Asia 1999 Partners 740239.41 2395268.48 30.90%
Europe 1999 Direct Sales 4755014.09 6502887.40 73.12%
Europe 1999 Internet 511273.40 6502887.40 7.86%
Europe 1999 Partners 1236599.91 6502887.40 19.02%
我想要的输出是:
Americas 1999 Direct Sales 7932550.86 12464862.43 63.64% 61.92%
Americas 1999 Internet 1377051.66 12464862.43 11.05% 12.73%
Americas 1999 Partners 3155259.91 12464862.43 25.31% 23.43%
Asia 1999 Direct Sales 1369875.55 2395268.48 57.19% 57.11%
Asia 1999 Internet 285153.52 2395268.48 11.90% 12.98%
Asia 1999 Partners 740239.41 2395268.48 30.90% 29.77%
Europe 1999 Direct Sales 4755014.09 6502887.40 73.12% 71.83%
Europe 1999 Internet 511273.40 6502887.40 7.86% 9.66%
Europe 1999 Partners 1236599.91 6502887.40 19.02% 18.32%
Americas 2000 Direct Sales 7967141.89 13788324.32 57.78% 63.64%
Americas 2000 Internet 1162343.86 13788324.32 8.43% 11.05%
Americas 2000 Partners 4658838.57 13788324.32 33.79% 25.31%
Asia 2000 Direct Sales 1242257.78 2343114.67 53.02% 57.19%
Asia 2000 Internet 242492.77 2343114.67 10.35% 11.90%
Asia 2000 Partners 858364.12 2343114.67 36.63% 30.90%
Europe 2000 Direct Sales 4493735.78 6737500.98 66.70% 73.12%
Europe 2000 Internet 415135.09 6737500.98 6.16% 7.86%
Europe 2000 Partners 1828630.11 6737500.98 27.14% 19.02%
最后的差异,意思是(val 1-val 2)。
但我收到的是:
Americas 1999 Direct Sales 23797652.58 37394587.29 63.64% 57.78%
Americas 1999 Direct Sales 23797652.58 37394587.29 63.64% 61.92%
Americas 1999 Direct Sales 23797652.58 37394587.29 63.64% 63.64%
Americas 1999 Internet 4131154.98 37394587.29 11.05% 11.05%
Americas 1999 Internet 4131154.98 37394587.29 11.05% 12.73%
Americas 1999 Internet 4131154.98 37394587.29 11.05% 8.43%
Americas 1999 Partners 9465779.73 37394587.29 25.31% 23.43%
Americas 1999 Partners 9465779.73 37394587.29 25.31% 25.31%
Americas 1999 Partners 9465779.73 37394587.29 25.31% 33.79%
Asia 1999 Direct Sales 4109626.65 7185805.44 57.19% 53.02%
Asia 1999 Direct Sales 4109626.65 7185805.44 57.19% 57.11%
Asia 1999 Direct Sales 4109626.65 7185805.44 57.19% 57.19%
Asia 1999 Internet 855460.56 7185805.44 11.90% 10.35%
Asia 1999 Internet 855460.56 7185805.44 11.90% 11.90%
Asia 1999 Internet 855460.56 7185805.44 11.90% 12.98%
Asia 1999 Partners 2220718.23 7185805.44 30.90% 29.77%
Asia 1999 Partners 2220718.23 7185805.44 30.90% 30.90%
Asia 1999 Partners 2220718.23 7185805.44 30.90% 36.63%
Europe 1999 Direct Sales 14265042.27 19508662.20 73.12% 66.70%
Europe 1999 Direct Sales 14265042.27 19508662.20 73.12% 71.83%
Europe 1999 Direct Sales 14265042.27 19508662.20 73.12% 73.12%
Europe 1999 Internet 1533820.20 19508662.20 7.86% 6.16%
Europe 1999 Internet 1533820.20 19508662.20 7.86% 7.86%
Europe 1999 Internet 1533820.20 19508662.20 7.86% 9.66%
Europe 1999 Partners 3709799.73 19508662.20 19.02% 18.32%
Europe 1999 Partners 3709799.73 19508662.20 19.02% 19.02%
Europe 1999 Partners 3709799.73 19508662.20 19.02% 27.14%
对于美洲,在最后一列的前3行中,它给出了2000年的结果,然后是1998年,然后是1999年,而在前一列中,它只根据需要给出了1999年的产出。
我使用的代码:
WITH previous_percentage AS(SELECT DISTINCT c3.region AS cr, t.year AS cy, c2.channel AS cd,
TO_CHAR(sum(s.amount) OVER(PARTITION BY c2.channel, t.year, c3.region )
/
sum(s.amount_sold) OVER(PARTITION BY t.year, c3.region ) * 100, 'fm99D00%') AS previous_year
FROM sh.sales s
JOIN sh.customers c ON s.cust_id = c.cust_id
JOIN sh.times t ON s.time_id = t.time_id
JOIN sh.channels c2 ON s.channel_id = c2.channel_id
JOIN sh.countries c3 ON c.country_id = c3.country_id
WHERE c3.region IN ('Americas', 'Europe','Asia') AND t.year IN ('1998','1999','2000')
)
SELECT DISTINCT c3.region, t.year, c2.channel,
sum(s.amount) OVER(PARTITION BY c2.channel, t.year, c3.region ) AS amount,
sum(s.amount) OVER(PARTITION BY t.year, c3.region ) AS whole_sum,
TO_CHAR(sum(s.amount) OVER(PARTITION BY c2.channel, t.year, c3.country_region )
/
sum(s.amount) OVER(PARTITION BY t.year, c3.region ) * 100, 'fm99D00%') AS percent_channels,
p.previous_year
FROM sh.sales s
JOIN sh.customers c ON s.cust_id = c.cust_id
JOIN sh.times t ON s.time_id = t.time_id
JOIN sh.channels c2 ON s.channel_id = c2.channel_id
JOIN sh.countries c3 ON c.country_id = c3.country_id
JOIN previous_percentage p ON p.cr = c3.region AND p.cd = c2.channel
WHERE c3.region IN ('Americas', 'Europe','Asia') AND t.year IN ('1999','2000','2001')
ORDER BY t.year ASC
;
我试图在CTE内操作查询,但无法得到任何有用的东西,我还认为有问题的日期是不同的,我怀疑这是主要问题,但我不知道如何修复它。我想我在某个地方犯了个错误,但我找不到。
1条答案
按热度按时间am46iovg1#
窗口函数是你的朋友。试试这个:
详情请参阅DB-fiddle。