仅当id不同时才汇总列

时间:2012-08-29 03:38:22

标签: mysql

希望每个人都做得很好。

我有以下输出......

+---------+--------------+--------------+-----------+---------+----------+
| ord_num | signoff_date | program_name | prod_desc | tx_comp | priority |
+---------+--------------+--------------+-----------+---------+----------+
| 1234567 | 2012-08-12   | ilearn       | run       |       1 |        1 |
| 1234567 | 2012-08-12   | ilearn       | plan      |       1 |        1 |
| 1234568 | 2012-08-12   | other        | run       |       1 |        1 |
| 1234569 | 2012-08-12   | other        | run       |       0 |        1 |
+---------+--------------+--------------+-----------+---------+----------+

我想要做的是SUM tx_comp列,每个唯一的“ord_num”。

现在我无法使用GROUP BY ord_num,因为我还对任务类型执行了sum

就像我需要知道之前的ord_num是什么,然后总结,如果不同?

非常感谢任何想法。

感谢。

*编辑*

SELECT 
    signoff_date,
    SUM(IF(prod_desc = 'run', 1, 0)) AS run,
    SUM(IF(prod_desc = 'plan', 1, 0)) AS plan,
    SUM(tx_comp) AS tx_comp 
FROM
(
    SELECT 
        ord_num,
        signoff_date,
        program_name,
        prod_desc,
        tx_comp,
        priority 
    FROM
        test.orders 
        LEFT JOIN test.tx_comp USING (ord_num)
) AS grp

显然不是理想的输出

+--------------+------+------+---------+
| signoff_date | run  | plan | tx_comp |
+--------------+------+------+---------+
| 2012-08-12   |    3 |    1 |       3 |
+--------------+------+------+---------+

我在追求......

+--------------+------+------+---------+
| signoff_date | run  | plan | tx_comp |
+--------------+------+------+---------+
| 2012-08-12   |    3 |    1 |       2 |
+--------------+------+------+---------+

2 个答案:

答案 0 :(得分:2)

如果tx_comp的值始终为1或0,那么我们可以利用COUNT(),这可能会给我们提供更多选择。例如,我们可以计算tx_comp为1的不同的ord_num:

COUNT(distinct IF(tx_comp, ord_num, NULL))

这给了我最后一个查询:

SELECT signoff_date,
  SUM(IF(prod_desc = 'run', 1, 0)) AS run,
  SUM(IF(prod_desc = 'plan', 1, 0)) AS plan,
  COUNT(distinct IF(tx_comp, ord_num, NULL)) as tx_comp
FROM 
  test.orders
  JOIN test.tx_comp USING (ord_num)
  GROUP BY signoff_date

在这种情况下不需要子查询。 (编辑为您的JOIN更新)

我用你的样本数据对此进行了测试;唯一的依赖是tx_comp的语义特性。你一直在说“SUM”,这假设该值最多为1(我理解它是一个布尔标志,并在另一个答案的注释中提到MAX(tx_comp)返回1,所以我想我们'好的)。

答案 1 :(得分:0)

也许只在MAX列上使用SUM而不是tx_comp?我不确定你的数据的语义,但我猜这就是你想要的。事实上,runplan也可能相同。

就此而言,当你正在使用布尔值时,真正想要的是BIT_OR