比如:table1里面有字段:日期,数量,商品号
20040101,10,001
20040201,11,002
20040301,15,003
20040401,12,001
20040501,16,002
20040601,18,003
我现在想用一条sql文实现,当我给出日期20040115和20040415两个日期后,出现以下效果:
商品号 期前数量 期中数量 期后数量
001 10 0 0
002 0 11 16
003 0 15 30
请问可以实现吗?如果不行应该怎么办?谢谢!!
20040101,10,001
20040201,11,002
20040301,15,003
20040401,12,001
20040501,16,002
20040601,18,003
我现在想用一条sql文实现,当我给出日期20040115和20040415两个日期后,出现以下效果:
商品号 期前数量 期中数量 期后数量
001 10 0 0
002 0 11 16
003 0 15 30
请问可以实现吗?如果不行应该怎么办?谢谢!!
sum(CASE WHEN dt < dt1 THEN value ELSE 0),
sum(CASE WHEN dt between dt1 and dt2 THEN value ELSE 0),
sum(CASE WHEN dt > dt2 THEN value ELSE 0)
from t
sum(CASE WHEN dt < dt1 THEN value ELSE 0),
sum(CASE WHEN dt between dt1 and dt2 THEN value ELSE 0),
sum(CASE WHEN dt > dt2 THEN value ELSE 0)
from t
group by 商品号
sum(数量 CASE WHEN 日期 < dt1 THEN value ELSE 0),
sum(数量 CASE WHEN 日期 between dt1 and dt2 THEN value ELSE 0),
sum(数量 CASE WHEN 日期 > dt2 THEN value ELSE 0)
from t
group by 商品号
是这样吗?
sum(CASE WHEN 日期 < 日期1 THEN 数量 ELSE 0 END),
sum(CASE WHEN 日期 between 日期1 and 日期2 THEN 数量 ELSE 0 END),
sum(CASE WHEN 日期 > 日期2 THEN 数量 ELSE 0 END)
from 表
group by 商品号
-- orcale 中不清楚
sum(CASE WHEN 日期 < 日期1 THEN 数量 ELSE 0 END) as 期前数量,
sum(CASE WHEN 日期 between 日期1 and 日期2 THEN 数量 ELSE 0 END) as 期中数量,
sum(CASE WHEN 日期 > 日期2 THEN 数量 ELSE 0 END) as 期后数量
from 表
group by 商品号
FROM (
SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 < DT1
GROUP BY 商品号
UNION
SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 >= DT1 AND 日期 <= DT2
GROUP BY 商品号
UNION ALL
SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
FROM T
WHERE 日期 > DT2
GROUP BY 商品号
) TT
GROUP BY 商品号;
FROM (
SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 < DT1
GROUP BY 商品号
UNION ALL
SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 >= DT1 AND 日期 <= DT2
GROUP BY 商品号
UNION ALL
SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
FROM T
WHERE 日期 > DT2
GROUP BY 商品号
) TT
GROUP BY 商品号;
FROM (
SELECT NVL(SUM(数量), 0) 期前数量, 0 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 < DT1
GROUP BY 商品号
UNION ALL
SELECT 0 期前数量, NVL(SUM(数量), 0) 期中数量, 0 期后数量, 商品号
FROM T
WHERE 日期 >= DT1 AND 日期 <= DT2
GROUP BY 商品号
UNION ALL
SELECT 0 期前数量, 0 期中数量, NVL(SUM(数量), 0) 期后数量, 商品号
FROM T
WHERE 日期 > DT2
GROUP BY 商品号
) TT
GROUP BY 商品号;
TEST DATA
use pubs
create table goods
(Gdate smalldatetime,
GTotal int,
Gnum char(3))
insert into goods
values('20040201',11,'002')
insert into goods
values('20040301',15,'003')
insert into goods
values('20040401',12,'001')
insert into goods
values('20040501',16,'002')
insert into goods
values('20040601',18,'003')
---------------------------------
use pubs select * from goodsuse pubs
select gnum,
sum(CASE WHEN gdate < '20040110' THEN gtotal ELSE 0 END),
sum(CASE WHEN gdate between '20040110' and '20040510' THEN gtotal ELSE 0 END),
sum(CASE WHEN gdate > '20040510' THEN gtotal ELSE 0 END)
from goods
group by gnum
--use pubs drop goods
001 10 12 0
002 0 27 0
003 0 15 18
特别是 windindance 、 lbl20020123 和 pressman 。