日期:2014-05-18  浏览次数:20416 次

求统计语句。
SQL code

原数据:
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   




------解决方案--------------------
SQL code
;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
  )

------解决方案--------------------
SQL code
----------------------------
-- 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,
SQL code

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