我有按类别列出用户销售额的表(每个销售额至少有一个,可能有多个类别)。
我可以为一个用户获得最重要的类别,但我需要一个用户的统计数据
二者都
他/她的前n个类别和其余类别。
我把问题归结为
MCVE
如下…
麦克维
Data
Summary
以下内容:
Salesman SaleID Amount Categories
-------- ------ ------ ------------------------------
1 1 2 Service
2 2 2 Software, Support_Contract
2 3 3 Service
2 4 1 Parts, Service, Software
2 5 3 Support_Contract
2 6 4 Promo_Gift, Support_Contract
2 7 -2 Rebate, Support_Contract
3 8 2 Software, Support_Contract
3 9 3 Service
3 10 1 Parts, Software
3 11 3 Support_Contract
3 12 4 Promo_Gift, Support_Contract
3 13 -2 Rebate, Support_Contract
MCVE安装程序SQL:
CREATE TABLE Sales ([Salesman] int, [SaleID] int, [Amount] int);
CREATE TABLE SalesTags ([SaleID] int, [TagId] int);
CREATE TABLE Tags ([TagId] int, [TagName] varchar(100) );
INSERT INTO Sales
([Salesman], [SaleID], [Amount])
VALUES
(1, 1, 2), (2, 6, 4), (3, 10, 1),
(2, 2, 2), (2, 7, -2), (3, 11, 3),
(2, 3, 3), (3, 8, 2), (3, 12, 4),
(2, 4, 1), (3, 9, 3), (3, 13, -2),
(2, 5, 3)
;
INSERT INTO SalesTags
([SaleID], [TagId])
VALUES
(1, 3), (6, 4), (10, 1),
(2, 1), (6, 5), (10, 2),
(2, 4), (7, 4), (11, 4),
(3, 3), (7, 6), (12, 4),
(4, 1), (8, 1), (12, 5),
(4, 2), (8, 4), (13, 4),
(4, 3), (9, 3), (13, 6),
(5, 4)
;
INSERT INTO Tags
([TagId], [TagName])
VALUES
(1, 'Software'),
(2, 'Parts'),
(3, 'Service'),
(4, 'Support_Contract'),
(5, 'Promo_Gift'),
(6, 'Rebate')
;
参见
this SQL Fiddle
,我可以获得用户的前n个标签,如:
WITH usersSales AS ( -- actual base CTE is much more complex
SELECT s.SaleID
, s.Amount
FROM Sales s
WHERE s.Salesman = 2
)
SELECT Top 3 -- N can be 3 to 10
t.TagName
, COUNT (us.SaleID) AS tagSales
, SUM (us.Amount) AS tagAmount
FROM usersSales us
INNER JOIN SalesTags st ON st.SaleID = us.SaleID
INNER JOIN Tags t ON t.TagId = st.TagId
GROUP BY t.TagName
ORDER BY tagAmount DESC
, tagSales DESC
, t.TagName
--显示用户的主要类别为:
-
“支持合同”
-
“服务”
-
“促销礼品”
按照这个顺序,对于用户2。(并支持用户3的合同、促销礼品、软件。)
但是
需要的结果
对于n=3,是:
-
用户2:
Top Category Amount Number of Sales
---------------- ------ ---------------
Support Contract 7 4
Service 4 2
Promo Gift 0 0
- All Others - 0 0
============================================
Totals 11 6
-
用户3:
Top Category Amount Number of Sales
---------------- ------ ---------------
Support Contract 7 4
Promo_Gift 0 0
Software 1 1
- All Others - 3 1
============================================
Totals 11 6
在哪里?
-
顶级类别
是给定销售的用户排名最高的类别(根据上面的查询)。
-
这个
顶级类别
第2行不包括第1行中已经核算的销售额。
-
这个
顶级类别
第3行不包括第1行和第2行中已占的销售额。
-
等。
-
所有未计入前n类的剩余销售额都归为
- All Others -
组。
-
底部的总数与用户的总销售额相匹配。
我如何汇总这样的结果?
请注意,这是在MS SQL Server 2017上运行的,我无法更改表模式。