用于比较以下查询结果的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;