1

希望每个人都做得很好。

我有以下输出...

+---------+-------------+--------------+--------- --+---------+----------+
| ord_num | 签收日期 | 程序名 | 产品描述 | tx_comp | 优先 |
+---------+-------------+--------------+--------- --+---------+----------+
| 1234567 | 2012-08-12 | 学习 | 运行 | 1 | 1 |
| 1234567 | 2012-08-12 | 学习 | 计划| 1 | 1 |
| 1234568 | 2012-08-12 | 其他| 运行 | 1 | 1 |
| 1234569 | 2012-08-12 | 其他| 运行 | 0 | 1 |
+---------+-------------+--------------+--------- --+---------+----------+

我想做的是每个唯一SUMtx_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

显然不是想要的输出

+--------------+------+------+---------+
| 签收日期 | 运行 | 计划| tx_comp |
+--------------+------+------+---------+
| 2012-08-12 | 3 | 1 | 3 |
+--------------+------+------+---------+

我在追...

+--------------+------+------+---------+
| 签收日期 | 运行 | 计划| tx_comp |
+--------------+------+------+---------+
| 2012-08-12 | 3 | 1 | 2 |
+--------------+------+------+---------+
4

2 回答 2

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

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

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

于 2012-08-29T05:22:58.623 回答
0

也许只是使用MAX而不是SUMtx_comp?我不确定您的数据的语义,但我猜这就是您想要的。事实上,对于run和也可能是一样的plan

就此而言,您真正想要的是BIT_OR,因为您正在使用布尔值。

于 2012-08-29T04:29:45.223 回答