用于比较以下查询结果的sql查询
运行每个查询的结果集如下用于比较以下查询结果的sql查询,sql,oracle,Sql,Oracle,运行每个查询的结果集如下 SELECT pd_end_dt,SUM(nrx_cnt) Total_Count FROM wkly_lnd.lnd_wkly_plan_rx_summary WHERE pd_end_dt >= '01-Sep-08' AND pd_end_dt < '30-Sep-08' GROUP BY pd_end_dt SELECT pd_end_dt,SUM(nrx_cnt) Total_Count FROM wkly_lnd.lnd_wkly_plan_r
SELECT pd_end_dt,SUM(nrx_cnt) Total_Count
FROM wkly_lnd.lnd_wkly_plan_rx_summary
WHERE pd_end_dt >= '01-Sep-08' AND pd_end_dt < '30-Sep-08'
GROUP BY pd_end_dt
SELECT pd_end_dt,SUM(nrx_cnt) Total_Count
FROM wkly_lnd.lnd_wkly_plan_rx_summary
WHERE pd_end_dt >= '01-Sep-07' AND pd_end_dt < '30-Sep-07'
GROUP BY pd_end_dt
去年也是如此
我需要计算与去年相比售出单位的差异,还需要添加一列,该列将显示百分比变化如果您想将查询结果与上一年的每一天进行比较,您可以按一年的每一天分组到_char'dd-mon':
有很多事情没有说。我希望你在日常工作中得到更明确的要求。。。 不管怎样,这里有一个模拟你的情况。这是基于以下假设,即2007年每周有一个数据的天数与2008年相同:
SQL> WITH lnd_wkly_plan_rx_summary AS (
2 SELECT DATE '2007-09-28' pd_end_dt, 702457.36 nrx_cnt FROM dual
3 UNION ALL SELECT DATE '2007-09-21', 703604.59 FROM dual
4 --
5 UNION ALL SELECT DATE '2008-09-28' pd_end_dt, 702557.36 nrx_cnt FROM dual
6 UNION ALL SELECT DATE '2008-09-21', 703404.59 FROM dual
7 )
8 SELECT to_char(pd_end_dt, 'dd-mon') pd_end_dt,
9 SUM(CASE
10 WHEN to_char(pd_end_dt, 'yyyy') = '2007' THEN
11 nrx_cnt
12 END) Total_2007,
13 SUM(CASE
14 WHEN to_char(pd_end_dt, 'yyyy') = '2008' THEN
15 nrx_cnt
16 END) Total_2008,
17 SUM(CASE
18 WHEN to_char(pd_end_dt, 'yyyy') = '2008' THEN
19 nrx_cnt
20 ELSE
21 -nrx_cnt
22 END) delta
23 FROM lnd_wkly_plan_rx_summary
24 WHERE ((pd_end_dt >= DATE '2007-09-01' AND pd_end_dt < DATE '2007-09-30') OR
25 (pd_end_dt >= DATE '2008-09-01' AND pd_end_dt < DATE '2008-09-30'))
26 GROUP BY to_char(pd_end_dt, 'dd-mon');
PD_END_DT TOTAL_2007 TOTAL_2008 DELTA
------------ ---------- ---------- ----------
28-sep 702457,36 702557,36 100
21-sep 703604,59 703404,59 -200
和您的原始查询,稍加修改
SQL> create table lnd_wkly_plan_rx_summary (pd_end_dt,nrx_cnt)
2 as
3 select date '2008-09-07', 100000 from dual union all
4 select date '2008-09-07', 536619.92 from dual union all
5 select date '2008-09-14', 698082.03 from dual union all
6 select date '2008-09-21', 403604.59 from dual union all
7 select date '2008-09-21', 200000 from dual union all
8 select date '2008-09-21', 100000 from dual union all
9 select date '2008-09-28', 702457.36 from dual union all
10 select date '2007-09-07', 400000 from dual union all
11 select date '2007-09-14', 450000 from dual union all
12 select date '2007-09-21', 500000 from dual union all
13 select date '2007-09-28', 550000 from dual union all
14 select date '2007-09-28', 100000 from dual
15 /
Tabel is aangemaakt.
以及用于比较2007年和2008年数据的查询:
SQL> SELECT pd_end_dt
2 , SUM(nrx_cnt) Total_Count
3 FROM lnd_wkly_plan_rx_summary
4 WHERE pd_end_dt >= date '2008-09-01'
5 AND pd_end_dt < date '2008-09-30'
6 GROUP BY pd_end_dt
7 /
PD_END_DT TOTAL_COUNT
------------------- -----------
07-09-2008 00:00:00 636619,92
14-09-2008 00:00:00 698082,03
21-09-2008 00:00:00 703604,59
28-09-2008 00:00:00 702457,36
4 rijen zijn geselecteerd.
SQL> SELECT pd_end_dt
2 , SUM(nrx_cnt) Total_Count
3 FROM lnd_wkly_plan_rx_summary
4 WHERE pd_end_dt >= date '2007-09-01'
5 AND pd_end_dt < date '2007-09-30'
6 GROUP BY pd_end_dt
7 /
PD_END_DT TOTAL_COUNT
------------------- -----------
07-09-2007 00:00:00 400000
14-09-2007 00:00:00 450000
21-09-2007 00:00:00 500000
28-09-2007 00:00:00 650000
4 rijen zijn geselecteerd.
虽然相当冗长,但我认为这是不言而喻的。
您可能喜欢以下重写,因为它不像上面的查询那样重复聚合函数:
SQL> select to_char(pd_end_dt,'dd-mm') day_and_month
2 , sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) sum2007
3 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) sum2008
4 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end)
5 - sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) difference
6 , ( sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end)
7 - sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end)
8 ) / sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) * 100 percentage_difference
9 from lnd_wkly_plan_rx_summary
10 where ( ( pd_end_dt >= date '2007-09-01'
11 and pd_end_dt < date '2007-09-30'
12 )
13 or ( pd_end_dt >= date '2008-09-07'
14 and pd_end_dt < date '2008-09-30'
15 )
16 )
17 group by to_char(pd_end_dt,'dd-mm')
18 /
DAY_A SUM2007 SUM2008 DIFFERENCE PERCENTAGE_DIFFERENCE
----- ---------- ---------- ---------- ---------------------
07-09 400000 636619,92 236619,92 37,1681615
14-09 450000 698082,03 248082,03 35,5376617
21-09 500000 703604,59 203604,59 28,9373595
28-09 650000 702457,36 52457,36 7,46769313
4 rijen zijn geselecteerd.
希望这有帮助
问候,,
Rob.为什么不看看Oracle提供的分析功能呢?我假设您正在使用Oracle,因为您已经用Oracle标记了您的问题。你可以参考 我正在简化您的数据集,使其看起来像这样
SQL> select day_and_month
2 , sum2007
3 , sum2008
4 , sum2008-sum2007 difference
5 , 100*(sum2008-sum2007)/sum2008 percentage_difference
6 from ( select to_char(pd_end_dt,'dd-mm') day_and_month
7 , sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) sum2007
8 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) sum2008
9 from lnd_wkly_plan_rx_summary
10 where ( pd_end_dt >= date '2007-09-01'
11 and pd_end_dt < date '2007-09-30'
12 )
13 or ( pd_end_dt >= date '2008-09-07'
14 and pd_end_dt < date '2008-09-30'
15 )
16 group by to_char(pd_end_dt,'dd-mm')
17 )
18 /
DAY_A SUM2007 SUM2008 DIFFERENCE PERCENTAGE_DIFFERENCE
----- ---------- ---------- ---------- ---------------------
07-09 400000 636619,92 236619,92 37,1681615
14-09 450000 698082,03 248082,03 35,5376617
21-09 500000 703604,59 203604,59 28,9373595
28-09 650000 702457,36 52457,36 7,46769313
4 rijen zijn geselecteerd.
这些是2007年和2008年9月8日、9日和10日的总计数
您可以使用以下查询:
假设表格是Tend_date,cnt您的名字太长了!对不起
09/08/2007 100
09/08/2008 200
09/09/2007 350
09/09/2008 400
09/10/2007 150
09/10/2008 175
简单地说,如果你复制、粘贴,这将不起作用
Select end_date, cnt,
LAG(cnt,1,0) over (order by
to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm'))) cntPrev,
cnt - LAG(cnt,1,0) over (order by
to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm'))) cntDiff
from T
你的问题是
Let X=LAG(cnt,1,0) over (order by
to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm')))
我不明白这个问题?你能更具体一点吗?是的,你所说的比较是什么意思?比较是什么意思?有什么区别吗?是总计数之间的差值吗?您应该提供一个您想要的示例。运行每个查询的结果集将类似于09/28/2007 00:00:00 702457.36 09/21/2007 00:00:00 703604.59 09/07/2007 00:00:00 636619.92 09/14/2007 00:00:00 698082.03同样,对于上一年,我需要计算与去年相比的售出单位差异,并添加一个列,该列将查找百分比变化。我没有您的表。我已经在我拥有的样本数据库上进行了测试。你为什么不看看我回复中的链接呢?行得通,我不是原来的海报。我确实用您的数据创建了一个表T,您建议的SQL包含语法错误。当我纠正语法时,我想知道结果将如何帮助原始海报。如果你说你已经测试了,那么你已经测试了其他东西。你能指出语法错误吗?因为您提出了一个关于我是否进行了测试的问题:下面是我从我的sql客户端粘贴的查询Select hiredate,sal,LAGsal,1,0 over order by to_numberto_charhiredate,'dd',to_numberto_charhiredate,'mm'cntprov,sal-LAGsal,1,0 over order by to_numberto_charhiredate,'dd',to_numberto_charhiredate,来自emp的“mm”cntDiff如果您是oracle用户,则必须熟悉scott架构的emp表。您使用结束日期作为列名,但在你的分析函数中,它们被称为end_dt…DAY_AND_MONTH SUM2007 SUM2008差异百分比_差异14 sep 698082.03 19 sep 706719.21 07 sep 636619.92 21 sep 703604.59 28 sep 702457.36 26 sep 731784.51 12 sep 711813.59我得到上面运行相同查询的结果是由于以下原因1。我们将在周末得到数据。与08年的周末日期一样,9月份的周末日期为05,12,19,26,07月份的周末日期为07,14,21,28,2。请告诉我如何比较数据,然后将group by子句和select列表中的相应表达式更改为使用格式掩码“iw”而不是“dd mm”。
Let X=LAG(cnt,1,0) over (order by
to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm')))
Select end_date, cnt, X cntPrev, cnt-X cntDiff
from T;