一个sql的写法,问题,高分求教

liujun999999 2010-06-14 03:05:01
有一个表
2个字段
datadate,date
每天有一条数据
比如
2010-5-1 80
2010-5-2 90
.....
2010-5-31 84
2010-6-1 79
2010-6-2 87
一直到今天
2010-6-14 97
现在要求一个sql查出下面的结果
datadate pdata cdata
1 80 79
2 90 87
。。。。
。。。。
31 97 84

我现场的查询会少了31号的数据,大家讨论一下
什么样才能把31号的数据一起查出来
...全文
113 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xie_yu 2010-06-14
  • 打赏
  • 举报
回复
路过。。。
chan10 2010-06-14
  • 打赏
  • 举报
回复
如果是,某一天所在月的话,

SELECT * FROM (SELECT a.p_date p_d, a.p_number pdata, b.p_date c_d, b.p_number cdata FROM test_date a LEFT JOIN test_date b
ON a.p_date = add_months(b.p_date,-1)
ORDER BY a.p_date) t WHERE t.p_d >= trunc(to_date('2010-04-17','yyyy-mm-dd'),'month')
AND t.p_d <= add_months(trunc(to_date('2010-04-17','yyyy-mm-dd'),'month'),1)-1;
chan10 2010-06-14
  • 打赏
  • 举报
回复
SQL:

SELECT * FROM (SELECT a.p_date p_d, a.p_number pdata, b.p_date c_d, b.p_number cdata FROM test_date a LEFT JOIN test_date b
ON a.p_date = add_months(b.p_date,-1)
ORDER BY a.p_date) t WHERE t.p_d >= to_date('2010-05-01','yyyy-mm-dd')
AND t.p_d <= to_date('2010-05-31','yyyy-mm-dd');


结果:


1 2010-5-1 20 2010-6-1 22
2 2010-5-2 30 2010-6-2 51
3 2010-5-3 50
4 2010-5-4 50
5 2010-5-5 50 2010-6-5 33
6 2010-5-6 50
7 2010-5-7 50
8 2010-5-8 50
9 2010-5-11 60 2010-6-11 55
10 2010-5-12 70
11 2010-5-21 50 2010-6-21 50
12 2010-5-22 50
13 2010-5-31 90 2010-6-30 61
fengyun817 2010-06-14
  • 打赏
  • 举报
回复
多写两个临时表也行(t2 上月,t3 本月),当然直接换掉t1合并成一个语句也行,就是乱点.具体代码就不写了,没环境,也不知道你的数据库是啥.
chan10 2010-06-14
  • 打赏
  • 举报
回复
指定日期的话,可以把日期条件放在外层(这里写死)。

SQL:


SELECT * FROM (SELECT a.p_date p_d, a.p_number pdata, b.p_date c_d, b.p_number cdata FROM test_date a LEFT JOIN test_date b
ON a.p_date = add_months(b.p_date,-1)
ORDER BY a.p_date) t WHERE t.p_d >= to_date('2010-04-01','yyyy-mm-dd')
AND t.p_d <= to_date('2010-04-30','yyyy-mm-dd');


结果:


1 2010-4-1 10 2010-5-1 20
2 2010-4-2 30 2010-5-2 30
3 2010-4-3 50 2010-5-3 50
4 2010-4-30 30 2010-5-31 90
fengyun817 2010-06-14
  • 打赏
  • 举报
回复
with t1 as
(
select '1' day from dual
union all
select '2' day from dual
union all
select '3' day from dual
....
union all
select '31' day from dual

)
select * from t1 a
left (上月份数据) b on to_char(b.date,'dd')=a.day
left (指定月份数据) c on to_char(c.date,'dd')=a.day
where 过滤条件
hemingwang0902 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chan10 的回复:]

不知道理解的对不对啊:

建表语句:

SQL code

CREATE TABLE test_date
(
p_date DATE,
p_number NUMBER
);




插入数据:
SQL code

INSERT INTO test_date VALUES(to_date('2010-04-01','yyyy-mm-dd'),10);
INSERT INTO t……
[/Quote]


这样查出来的是当月和下月的数据,如果传入的是 6 月,则查不到 7 月(下月) 31 号的数据
hemingwang0902 2010-06-14
  • 打赏
  • 举报
回复
很遗憾,琢磨了半天都没琢磨出来。

比较的时候为什么一定要将当前月的所有天数都显示呢,比如说现在是 2010-06-17,只将当月数据显示到 2010-06-17 不行么? 为什么一定要显示到 2010-06-30 呢,如果要看 2010-05 月的全部数据的话,直接查询 2010-05 月 和 2010-04 月 的数据展现出来不就可以了吗?
liujun999999 2010-06-14
  • 打赏
  • 举报
回复
这个没限制月份,限制月份你就看出来了,呵呵,你的sql跟我的是一样的
chan10 2010-06-14
  • 打赏
  • 举报
回复

SELECT a.p_date, a.p_number pdata, b.p_date, b.p_number cdata FROM test_date a LEFT JOIN test_date b
ON a.p_date = add_months(b.p_date,-1)
ORDER BY a.p_date;
chan10 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liujun999999 的回复:]
chan10兄弟很用心,多谢啦,但是你的方案和我的一样,在某些情况下,31号数据会被丢掉
比如4月份跟5月分最后一天的对比就丢了
[/Quote]
再插入两条数据:

INSERT INTO test_date VALUES(to_date('2010-03-31','yyyy-mm-dd'),20);
INSERT INTO test_date VALUES(to_date('2010-04-30','yyyy-mm-dd'),30);
COMMIT;


查询结果:

1 2010-3-31 20
2 2010-4-1 10
3 2010-4-2 30
4 2010-4-3 50
5 2010-4-30 30 2010-3-31 20
6 2010-5-1 20 2010-4-1 10
7 2010-5-2 30 2010-4-2 30
8 2010-5-3 50 2010-4-3 50
9 2010-5-4 50
10 2010-5-5 50
11 2010-5-6 50
12 2010-5-7 50
13 2010-5-8 50
14 2010-5-11 60
15 2010-5-12 70
16 2010-5-21 50
17 2010-5-22 50
18 2010-5-31 90 2010-4-30 30
19 2010-6-1 22 2010-5-1 20
20 2010-6-2 51 2010-5-2 30
21 2010-6-5 33 2010-5-5 50
22 2010-6-11 55 2010-5-11 60
23 2010-6-21 50 2010-5-21 50
24 2010-6-30 61 2010-5-31 90


看看还是这意思?
liujun999999 2010-06-14
  • 打赏
  • 举报
回复
chan10兄弟很用心,多谢啦,但是你的方案和我的一样,在某些情况下,31号数据会被丢掉
比如4月份跟5月分最后一天的对比就丢了
liujun999999 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fengyun817 的回复:]

引用 4 楼 liujun999999 的回复:
楼上的不行
a的数据没有整月的,只有从当月1号到当天的数据
你这样比如今天14号,14号之后的数据都查不出来了


先写一个临时表,日期是1-31 然后左关联两个月数据.
[/Quote]
这个是个解决办法
其他的都不能满足要求
谢谢啦
坐等不用临时表的方案
chan10 2010-06-14
  • 打赏
  • 举报
回复
不知道理解的对不对啊:

建表语句:


CREATE TABLE test_date
(
p_date DATE,
p_number NUMBER
);



插入数据:

INSERT INTO test_date VALUES(to_date('2010-04-01','yyyy-mm-dd'),10);
INSERT INTO test_date VALUES(to_date('2010-04-02','yyyy-mm-dd'),30);
INSERT INTO test_date VALUES(to_date('2010-04-03','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-01','yyyy-mm-dd'),20);
INSERT INTO test_date VALUES(to_date('2010-05-02','yyyy-mm-dd'),30);
INSERT INTO test_date VALUES(to_date('2010-05-03','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-04','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-05','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-06','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-07','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-08','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-11','yyyy-mm-dd'),60);
INSERT INTO test_date VALUES(to_date('2010-05-12','yyyy-mm-dd'),70);
INSERT INTO test_date VALUES(to_date('2010-05-21','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-22','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-05-31','yyyy-mm-dd'),90);
INSERT INTO test_date VALUES(to_date('2010-06-01','yyyy-mm-dd'),22);
INSERT INTO test_date VALUES(to_date('2010-06-02','yyyy-mm-dd'),51);
INSERT INTO test_date VALUES(to_date('2010-06-05','yyyy-mm-dd'),33);
INSERT INTO test_date VALUES(to_date('2010-06-11','yyyy-mm-dd'),55);
INSERT INTO test_date VALUES(to_date('2010-06-21','yyyy-mm-dd'),50);
INSERT INTO test_date VALUES(to_date('2010-06-30','yyyy-mm-dd'),61);
COMMIT;


查询语句:

SELECT a.p_date, a.p_number pdata, b.p_date, b.p_number cdata FROM test_date a LEFT JOIN test_date b
ON a.p_date = add_months(b.p_date,1)
ORDER BY a.p_date;


查询结果;

1 2010-4-1 10
2 2010-4-2 30
3 2010-4-3 50
4 2010-5-1 20 2010-4-1 10
5 2010-5-2 30 2010-4-2 30
6 2010-5-3 50 2010-4-3 50
7 2010-5-4 50
8 2010-5-5 50
9 2010-5-6 50
10 2010-5-7 50
11 2010-5-8 50
12 2010-5-11 60
13 2010-5-12 70
14 2010-5-21 50
15 2010-5-22 50
16 2010-5-31 90
17 2010-6-1 22 2010-5-1 20
18 2010-6-2 51 2010-5-2 30
19 2010-6-5 33 2010-5-5 50
20 2010-6-11 55 2010-5-11 60
21 2010-6-21 50 2010-5-21 50
22 2010-6-30 61 2010-5-31 90
fengyun817 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 liujun999999 的回复:]
楼上的不行
a的数据没有整月的,只有从当月1号到当天的数据
你这样比如今天14号,14号之后的数据都查不出来了
[/Quote]

先写一个临时表,日期是1-31 然后左关联两个月数据.
yongzonglai 2010-06-14
  • 打赏
  • 举报
回复
那就再加一个条件呗


select a.datadate as data,a.date as cdata,b.date as pdata

from (select * from 表名 where datename(month,datadate)=datename(month,getdate())) a

left join

(select * from 表名 where datename(month,datadate)=datename(month,getdate())-1) b

on (a.datadate=b.datadate and datepart(dd,a.datadate)<=datepart(dd,getdate()))
liujun999999 2010-06-14
  • 打赏
  • 举报
回复
楼上的不行
a的数据没有整月的,只有从当月1号到当天的数据
你这样比如今天14号,14号之后的数据都查不出来了
yongzonglai 2010-06-14
  • 打赏
  • 举报
回复
你试一下 看一下行不行

select a.datadate as data,a.date as cdata,b.date as pdata

from (select * from 表名 where datename(month,datadate)=datename(month,getdate())) a

left join

(select * from 表名 where datename(month,datadate)=datename(month,getdate())-1) b

on a.datadate=b.datadate
liujun999999 2010-06-14
  • 打赏
  • 举报
回复
这个表很简单,2个字段,1个是日期,1个是数据
现在是要一个sql查出2个月的对比数据来
pdata表示上月数据
cdata表示当月数据
24K純帥 2010-06-14
  • 打赏
  • 举报
回复
俺想问下这个data,pdata,cdata是什么呀

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧