我有一个包含年度数据的表格,每个客户每月的购买数量。看起来是这样的:
ID MON NUM_PURCHASES
1 1 1
2 1 3
3 1 4
2 2 5
(其中id是客户id,mon是一年中的月份)。我想选择所有的ID,其中至少有一个购买每月通过一年。
我正在寻找比以下更优雅的解决方案(这不起作用-请参阅我的编辑2019-04-03):
SELECT distinct id
FROM my_table
where (num_purchases >= 1 and mon = 1) and
(num_purchases >= 1 and mon = 2) and ...
(num_purchases >= 1 and mon = 12);
(注意,“…”表示mon值从1到12的所有计数)
有什么更优雅的方法呢?谢谢。
编辑(2019-04-03):
我意识到上面的查询是多么可笑-除非我转换表并将来自一个客户的所有记录放在一行中,否则它永远不会返回任何内容:/。
在vamsi的回答之后,我意识到我没有提到我的表不包含当月0次购买的记录,它只包含一个月内进行购买的数据(对于客户)(因此缺少一些月份)。
多亏了vamsi的解决方案,我找到了以下解决方法:
select id, total_purchases
FROM
(select id, SUM(CAST(mon as int)) as sum_mon, SUM(CAST(num_purchases as int)) as total_purchases
FROM my_table
group by cid) a where sum_mon == 78;
(这一点也不优雅,但至少是可行的。但是,它不适用于更一般的情况,即如果表中每个客户都有0条记录,或者如果我们要选择一个月内购买了2次或更多的客户。不过,我现在不需要这个,但它对遇到类似问题的人可能有用。)
1条答案
按热度按时间rbpvctlc1#
这可以通过
group by
以及having
.使用
year
在group by
如果表中有这样一列。该解决方案假设每个id每个月有一行,并且没有遗漏月份。如果不是这样,请根据所示的想法修改查询