我有一个表,其中包含年份数据以及每个客户每月的购买数量。看起来像这样:
ID MON NUM_PURCHASES
1 1 1
2 1 3
3 1 4
2 2 5
(其中ID是客户ID,mon是一年中的月份)。我想选择所有一年中每月每月至少购买1次的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);
(请注意,“ ...”表示从1到12的所有mon值计数)
还有什么更优雅的方法?谢谢。
编辑(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次或更多次。虽然目前我不需要,但是对于遇到类似问题的人来说可能很有用。)
答案 0 :(得分:1)
这可以通过group by
和having
完成。
SELECT id
FROM my_table
GROUP BY id
HAVING SUM(CAST(num_purchases > 0 AS INT)) = 12
如果表具有此类列,请在year
中使用group by
。
该解决方案假定每个id每个月有一行,并且没有丢失的月份。如果不是这种情况,请根据显示的想法修改查询