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

ABC分类法的问题
大家好,比如我有一张表:
SQL code
declare @importantLead table
    (
        custID int,
        amount decimal(18,0),
        ownerID int,
        deptID int
    )


然后,这里面的东西就是说,按照amount降序排列,每个owner都有好几个custID,现在是需要从上往下查找,比如找到前4行的amount占到总的60%,则认为这些是重要的客户,这时候统计下有多少个,只需要得到重要客户的个数。

请教下如何实现。


------解决方案--------------------
SQL code

declare @importantLead table
    (
        custID int,
        amount decimal(18,0),
        ownerID int,
        deptID int
    )

insert @importantLead
select 1,20,1,1 union all
select 1,24,2,1 union all
select 2,52,2,2 union all
select 3,96,1,3 union all
select 3,45,3,3 union all
select 3,96,3,3 union all
select 3,34,4,3 union all
select 3,18,2,3

declare @total float
set @total=(select SUM(amount) from @importantLead)
declare @sum float
set @sum=(select SUM(amount) from
(select top 4 amount from @importantLead order by amount desc)a)
if (@sum/@total)>=0.6 
select count(distinct custID) as 重要客户数 from(
select top 4 custID from @importantLead order by amount desc)b

/*
重要客户数
2
*/

------解决方案--------------------
SQL code

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')
BEGIN
    DROP TABLE tba
END
GO
CREATE table tba
    (
        custID int,
        amount decimal(18,0),
        ownerID int,
        deptID int
    )
       
    INSERT INTO tba

SELECT 1,1000,1,1 UNION
SELECT 2,2000,1,1 UNION
SELECT 3,5000,1,1 UNION
SELECT 4,1000,1,1 UNION
SELECT 5,500,1,1 UNION
SELECT 6,100,1,1 UNION
SELECT 7,100,1,1 UNION
SELECT 8,100,1,1 UNION
SELECT 9,0,1,1 UNION
SELECT 10,0,1,1 UNION
SELECT 11,0,1,1

GO

WITH tbb AS
( SELECT custID,amount,ownerID,deptID,RN=ROW_NUMBER() OVER (ORDER BY amount Desc) FROM tba
)

SELECT custID,(SELECT SUM(amount) FROM tbb AS B WHERE A.RN >= B.RN) AS amount,(SELECT SUM(amount) FROM tbb AS B WHERE A.RN >= B.RN)/(SELECT SUM(amount) FROM tbb) AS Proportion
FROM tbb AS A

custID    amount    Proportion
3    5000    0.510204
2    7000    0.714285
1    8000    0.816326
4    9000    0.918367
5    9500    0.969387
6    9600    0.979591
7    9700    0.989795
8    9800    1.000000
9    9800    1.000000
10    9800    1.000000
11    9800    1.000000