使用不同String的COUNT的SUM进行SELECT

时间:2014-02-12 18:49:37

标签: mysql select count distinct

数据如下:

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

2 个答案:

答案 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