日期:2014-05-18 浏览次数:20452 次
原数据: cCusCode cInvCode dDate iTaxUnitPrice iQuantity --------------------- 00001 01 2010-02-01 10 200 00001 02 2010-02-01 5 100 00001 01 2010-02-02 9 50 00002 02 2010-02-02 9 300 00002 01 2010-02-02 10 200 00002 02 2010-02-04 10 200 需求(按cCusCode得出销售数量(iQuantity)最多的cInvCode,并取cInvCode的最后一次单价(iTaxUnitPrice)) 结果如下: cCusCode cInvCode iTaxUnitPrice iQuantity ---------------------------------------------------- 00001 01 9 250 00002 02 10 500
;WITH CTE AS ( SELECT cCusCode,cInvCode,iTaxUnitPrice,SUM(iQuantity) AS iQuantity FROM TAB GROUP BY cCusCode,cInvCode,iTaxUnitPrice ) SELECT B.cCusCode,B.cInvCode,A.iTaxUnitPrice,B.iQuantity FROM TAB A,CTE B WHERE A.cCusCode = B.cCusCode AND A.cInvCode = B.cInvCode AND NOT EXISTS ( SELECT 1 FROM TAB WHERE cCusCode= A.cCusCode AND cInvCode = A.cInvCode AND dDate > A.dDate ) AND NOT EXISTS ( SELECT 1 FROM CTE WHERE cCusCode= B.cCusCode AND iQuantity> B.iQuantity )
------解决方案--------------------
---------------------------- -- Author :fredrickhu(小F,向高手学习) -- Date :2011-12-06 08:56:47 -- Version: -- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) -- Apr 22 2011 11:57:00 -- Copyright (c) Microsoft Corporation -- Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64) -- ---------------------------- --> 测试数据:[tb] if object_id('[tb]') is not null drop table [tb] go create table [tb]([cCusCode] varchar(5),[cInvCode] varchar(2),[dDate] datetime,[iTaxUnitPrice] int,[iQuantity] int) insert [tb] select '00001','01','2010-02-01',10,200 union all select '00001','02','2010-02-01',5,100 union all select '00001','01','2010-02-02',9,50 union all select '00002','02','2010-02-02',9,300 union all select '00002','01','2010-02-02',10,200 union all select '00002','02','2010-02-04',10,200 --------------开始查询-------------------------- ; with f as ( select cCusCode,cInvCode,SUM(iQuantity) as iQuantity from tb group by cCusCode,cInvCode ) select a.*,b.iTaxUnitPrice from f a join tb b on a.cCusCode=b.cCusCode and a.cInvCode=b.cInvCode where b.iTaxUnitPrice=(select top 1 iTaxUnitPrice from tb where cCusCode=b.cCusCode order by dDate desc) and a.iQuantity=(select MAX(iQuantity) from f where cCusCode=a.cCusCode) ----------------结果---------------------------- /* cCusCode cInvCode iQuantity iTaxUnitPrice -------- -------- ----------- ------------- 00001 01 250 9 00002 02 500 10 (2 行受影响) */
------解决方案--------------------
sorry, 8楼代码有bug,
create table GDTOPONE (cCusCode varchar(8), cInvCode varchar(2), dDate date, iTaxUnitPrice int, iQuantity int) insert into GDTOPONE select '00001', '01', '2010-02-01', 10, 200 union all select '00001', '02', '2010-02-01', 5, 100 union all select '00001', '01', '2010-02-02', 9, 50 union all select '00002', '02', '2010-02-02', 9, 300 union all select '00002', '01', '2010-02-02', 10, 200 union all select '00002', '02', '2010-02-04', 10, 200 with t1 as (select t.cCusCode,t.cInvCode, sum(t.iQuantity) iQuantity from GDTOPONE t group by t.cCusCode,t.cInvCode ), t2 as (select row_number() over(partition by cInvCode,cCusCode order by dDate) rn, cCusCode,cInvCode,iTaxUnitPrice from GDTOPONE ), t3 as (select t1.cCusCode,max(t1.iQuantity) iQuantity from t1 group by t1