这个问题想了很久也想不出来,数据如下:
编号 品名 数量 日期 供商
1011 a 10 2009-01-01 001
1011 a 1 2009-01-01 002
1011 a 3 2009-01-03 001
1012 b 3 2009-01-01 001
1012 b 5 2009-01-02 003
1012 b 5 2009-01-02 003我想得到以下结果:
编号 品名 数量 日期 供商
1011 a 14 2009-01-03 001
1012 b 13 2009-01-02 003
说明一下:结果是取每个编号最后一个日期及对应的供商,只要一个值,并且数量是要相加的,请帮帮我
编号 品名 数量 日期 供商
1011 a 10 2009-01-01 001
1011 a 1 2009-01-01 002
1011 a 3 2009-01-03 001
1012 b 3 2009-01-01 001
1012 b 5 2009-01-02 003
1012 b 5 2009-01-02 003我想得到以下结果:
编号 品名 数量 日期 供商
1011 a 14 2009-01-03 001
1012 b 13 2009-01-02 003
说明一下:结果是取每个编号最后一个日期及对应的供商,只要一个值,并且数量是要相加的,请帮帮我
a.编号,
a.品名,
b.数量,
a.日期,
a.供商
from
tb a,
(select 编号,sum(数量) as 数量 from tb group by 编号) b
where
a.编号=b.编号
and
not exists(select 1 from tb where 编号=a.编号 and 日期>a.日期)
(
编号 varchar(10),
品名 varchar(20),
数量 int,
日期 datetime,
供商 varchar(10)
)
insert into #TT2 select '1011','a',10,'2009-01-01','001'
union all select '1011','a',1,'2009-01-01','002'
union all select '1011','a',3,'2009-01-03','001'
union all select '1012','b',3,'2009-01-01','001'
union all select '1012','b',5,'2009-01-02','003'
union all select '1012','b',5,'2009-01-02','003'select distinct t1.供商,t.* from
(
select 编号,品名,sum(数量) 数量,max(日期) 日期 from #TT2 group by 编号,品名
) t join #TT2 t1 on t.编号=t1.编号 and t.日期=t1.日期 and t.品名=t1.品名
(
select 编号,品名,sum(数量) 数量,max(日期) 日期 from #TT2 group by 编号,品名
) t
join #TT2 t1
on t.编号=t1.编号 and t.日期=t1.日期 and t.品名=t1.品名供商 编号 品名 数量 日期
---------- ---------- -------------------- ----------- -----------------------
001 1011 a 14 2009-01-03 00:00:00.000
003 1012 b 13 2009-01-02 00:00:00.000(2 行受影响)
(SELECT 编号,品名,SUM(数量)数量 FROM TB GROUP BY 编号,品名)AS T,
(SELECT 编号,MAX(日期)AS 日期,供商 FROM TB GROUP BY 编号,供商)AS T1
WHERE T.编号=T1.编号
create table TB
(
编号 varchar(10),
品名 varchar(20),
数量 int,
日期 datetime,
供商 varchar(10)
)
insert into TB select '1011','a',10,'2009-01-01','001'
union all select '1011','a',1,'2009-01-01','002'
union all select '1011','a',3,'2009-01-03','001'
union all select '1012','b',3,'2009-01-01','001'
union all select '1012','b',5,'2009-01-02','003'
union all select '1012','b',5,'2009-01-02','003'SELECT DISTINCT T.编号,T.品名,T.数量,T3.日期,T3.供商 FROM
(SELECT 编号,品名,SUM(数量)数量 FROM TB GROUP BY 编号,品名)AS T,
(SELECT 编号,MAX(日期)AS 日期 FROM TB GROUP BY 编号)AS T1,
(SELECT * FROM TB WHERE EXISTS(SELECT * FROM (SELECT 编号,MAX(日期)AS 日期 FROM TB GROUP BY 编号) AS T2 WHERE TB.编号=T2.编号 AND TB.日期=T2.日期))AS T3
WHERE T.编号=T1.编号 AND T3.编号=T.编号编号 品名 数量 日期 供商
---------- -------------------- ----------- ------------------------------------------------------ ----------
1011 a 14 2009-01-03 00:00:00.000 001
1012 b 13 2009-01-02 00:00:00.000 003(所影响的行数为 2 行)
insert into tb select '1011','a',10,'2009-01-01','001'
union all select '1011','a',1,'2009-01-01','002'
union all select '1011','a',3,'2009-01-03','001'
union all select '1012','b',3,'2009-01-01','001'
union all select '1012','b',5,'2009-01-02','003'
union all select '1012','b',5,'2009-01-02','003'
select *,(select top 1 供商 from tb where 编号=a.编号 and 日期=a.日期) as 供商 from (
select 编号,品名,sum(数量) as 数量,max(日期) as 日期 from tb group by 编号,品名
)a
go
drop table tb
/*
编号 品名 数量 日期 供商
---------- -------------------- ----------- ----------------------- ----------
1011 a 14 2009-01-03 00:00:00.000 001
1012 b 13 2009-01-02 00:00:00.000 003
*/
distinct
a.编号,
a.品名,
b.数量,
a.日期,
a.供商
from
tb a,
(select 编号,sum(数量) as 数量 from tb group by 编号) b
where
a.编号=b.编号
and
not exists(select 1 from tb where 编号=a.编号 and 日期>a.日期)
(
select 编号,品名,sum(数量) 数量,max(日期) 日期 from #TT2 group by 编号,品名
) t
join #TT2 t1
on t.编号=t1.编号 and t.日期=t1.日期 and t.品名=t1.品名