希望每个人都做得很好。
我有以下输出......
+---------+--------------+--------------+-----------+---------+----------+ | 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 | +--------------+------+------+---------+
答案 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
?我不确定你的数据的语义,但我猜这就是你想要的。事实上,run
和plan
也可能相同。
就此而言,当你正在使用布尔值时,真正想要的是BIT_OR
。