数据如下:
ItemID | Customer# | Order# | Salesman
ITEM1 123 555 GUY1
ITEM2 123 555 GUY1
ITEM3 123 556 GUY1
ITEM1 123 557 GUY3
ITEM2 123 558 GUY2
ITEM3 222 559 GUY4
所需结果应具有该客户的每个销售员的唯一Customer#和Count唯一订单#:
Customer# | GUY1 | GUY2 | GUY3 | GUY4 | TOTAL
123 2 1 1 0 4
222 0 0 0 1 1
更新
此查询有效,但为什么我必须在末尾添加减号(-1)才能使其正常工作?
SELECT
CUSTOMER_NUMBER,
COUNT(DISTINCT(IF(SALESMAN = 'GUY1', ORDER#, 0)))-1 AS 'GUY1',
--More salesmen
COUNT(DISTINCT (ORDER#)) AS Total
FROM
TABLE
GROUP BY CUSTOMER_NUMBER
答案 0 :(得分:1)
将您的查询更新为此
SELECT
CUSTOMER_NUMBER,
SUM(IF(SALESMAN = 'GUY1', 1, 0)) AS 'GUY1',
SUM(IF(SALESMAN = 'GUY2', 1, 0)) AS 'GUY2',
--more case statements for salesman
(COUNT(DISTINCT (ORDER#))) AS Total
FROM
TABLE
GROUP BY CUSTOMER_NUMBER
但要小心。如果你有庞大的桌子或很多推销员 - 这个查询会降低你的系统速度
更新了查询:
SELECT
t.CUSTOMER_NUMBER,
SUM(IF(t.SALESMAN = 'GUY1', 1, 0)) AS 'GUY1',
SUM(IF(t.SALESMAN = 'GUY2', 1, 0)) AS 'GUY2',
--more case statements for salesman
(COUNT(t.ORDER#)) AS Total
FROM
(SELECT CUSTOMER_NUMBER, ORDER#, SALESMAN
FROM TABLE
GROUP BY CUSTOMER_NUMBER, ORDER#, SALESMAN) t
GROUP BY t.CUSTOMER_NUMBER
那应该有用
答案 1 :(得分:1)
此查询有效,但为什么我必须在末尾添加减号(-1)才能使其正常工作?
实际上没有,你的查询并不总能正常工作,但在学习了它的工作原理后你能够自己看到它(包括减号的原因)。
首先,让我们看看这些IF表达式为非聚合集返回的结果类型。使用问题中的数据样本和GUY1
表达式,我们将得到:
ItemID Customer# Order# Salesman IF(SALESMAN = 'GUY1', ORDER#, 0)
------ --------- ------ -------- --------------------------------
ITEM1 123 555 GUY1 555
ITEM2 123 555 GUY1 555
ITEM3 123 556 GUY1 556
ITEM1 123 557 GUY3 0
ITEM2 123 558 GUY2 0
ITEM3 222 559 GUY4 0
你可以看到,对于Customer# = 123
,IF表达式有三个不同的值:555,556和0.因此,该表达式的COUNT(DISTINCT ...)
将返回3.但是,{{1}的正确答案应该是2.它是0扭曲结果。这就是使用GUY1
的原因:它会将- 1
的结果调整为正常。
但是,并不总是需要进行调整。更具体地说,当我们计算某个客户的唯一销售员的不同订单时,不需要它。您的示例实际上包含这样一种情况:客户COUNT(DISTINCT ...)
只有一个推销员GUY4
。对于222
行,您的预期输出在GUY4
下显示1,但实际上your query should return 0 there,即输出为:
222
如果我们记住COUNT不计算NULL的事实,很容易解决问题。只需在IF表达式中使用该事实:使用NULL而不是0来省略不相关的订单。当然,你需要摆脱Customer# | GUY1 | GUY2 | GUY3 | GUY4 | TOTAL
123 2 1 1 0 4
222 0 0 0 0 1
调整。 This query将始终如一地返回正确的结果:
- 1