我一直在寻找一种方法来迭代 case 语句中列的唯一值。我不知道唯一值会是什么。像这样的东西。
CASE WHEN (distinct value for car_model) THEN (SELECT sum(buyers) FROM table WHERE car_model NOT IN distinct value for car_model)
我希望 case 语句遍历car_model的所有不同值。出于某种原因,我不知道该怎么做。我不知道语法来确保 WHEN 中的非重复值与我的 WHERE 子句中的值相同。
桌子
+-----------+---------+--------+
| car_model | sales | buyers |
+-----------+---------+--------+
| rav4 | 100,000 | 5 |
| rav4 | 15,000 | 1 |
| cc | 20,000 | 1 |
| navigator | 30,000 | 1 |
| cc | 17,000 | 1 |
| q5 | 78,000 | 3 |
+-----------+---------+--------+
期望的结果
+-----------+--------+
| car_model | buyers |
+-----------+--------+
| rav4 | 6 |
| cc | 10 |
| navigator | 11 |
| q5 | 9 |
+-----------+--------+
也许这会起作用:
未经测试
select t.car_model, (select sum(buyers) from table) - sum(t.buyers) buyers
from table t
group by t.car_model
这将取所有买家的总和,并减去当前行car_model的买家总和。
要获得"不包括行项目 [总计] 的总数"(如您在评论中提到的),您需要汇总所有型号的所有买家以获得总买家,然后汇总每个型号的买家并从总买家中减去它。以下是使用 CROSS JOIN 执行此操作的一种方法:
SELECT
c.car_model
, t.total_buyers - SUM(c.buyers) AS total_buyers_minus_buyers_for_this_model
FROM Table c
CROSS JOIN
(SELECT SUM(buyers) AS total_buyers FROM Table) t
GROUP BY
c.car_model
请参阅有关 SQLFiddle 的示例。