22,209
社区成员
发帖
与我相关
我的任务
分享
;WITH a(goodno,soldamount) AS (
SELECT '1011',2000 UNION ALL
SELECT '1010',1800 UNION ALL
SELECT '1009',1600 UNION ALL
SELECT '1008',1400 UNION ALL
SELECT '1007',1200 UNION ALL
SELECT '1006',800 UNION ALL
SELECT '1005',700 UNION ALL
SELECT '1004',300 UNION ALL
SELECT '1003',150 UNION ALL
SELECT '1002',50
),b AS (
SELECT ROW_NUMBER()OVER(ORDER BY a.soldamount DESC) AS Seq, SUM(a.soldamount)OVER(PARTITION BY 1) AS TotalAmount,* FROM a
)
SELECT *,CASE WHEN ROUND( (b.soldamount+ISNULL(t.prevTotal,0))*1.0/b.TotalAmount,4) *100 BETWEEN 0 AND 80 THEN 'A'
WHEN ROUND( (b.soldamount+ISNULL(t.prevTotal,0))*1.0/b.TotalAmount,4) *100 BETWEEN 80 AND 95 THEN 'B'
WHEN ROUND( (b.soldamount+ISNULL(t.prevTotal,0))*1.0/b.TotalAmount,4) *100 BETWEEN 95 AND 100 THEN 'C'
ELSE 'D' END AS Grade
FROM b
OUTER APPLY(SELECT SUM(lb.soldamount) AS prevTotal FROM b AS lb WHERE lb.seq<b.seq ) t
/*
Seq TotalAmount goodno soldamount prevTotal Grade
1 10000 1011 2000 NULL A
2 10000 1010 1800 2000 A
3 10000 1009 1600 3800 A
4 10000 1008 1400 5400 A
5 10000 1007 1200 6800 A
6 10000 1006 800 8000 B
7 10000 1005 700 8800 B
8 10000 1004 300 9500 C
9 10000 1003 150 9800 C
10 10000 1002 50 9950 C
*/