我有一张桌子:
Subscriptions (idsub, dstart, dend, #idk)
dstart是购买订阅的日期(数据类型:日期)
我需要计算今年(最好是-选择的年份)每个月购买了多少个订阅。 我知道应该用COUNT完成,但是我刚开始学习SQL,并且在“每个月”这一部分都在挣扎。
我正在使用Postgresql
感谢帮助
答案 0 :(得分:2)
尝试一下
SELECT TO_CHAR(dstart, 'MM/YYYY') date, COUNT(*) total
FROM Subscriptions
WHERE EXTRACT(year from dstart) = 2019
GROUP BY TO_CHAR(dstart, 'MM/YYYY')
答案 1 :(得分:1)
诀窍是应用GROUP BY
,以便您的COUNT
可以按月使用。您提到dstart
是开始日期,因此我们将不得不从中获取月份。一种实现方法是使用date_trunc
。 (date_trunc
的文档可在此处阅读,以获取有关其工作原理的更多信息:https://www.postgresql.org/docs/9.1/functions-datetime.html)。
最后,您可以使用CURRENT_DATE
获取当前年份,然后再次使用date_trunc
仅获得今年的订阅。
总而言之,您的查询应如下所示:
SELECT
DATE_TRUNC('MONTH', dstart),
COUNT(idsub)
FROM Subscriptions
; to change the year, just change CURRENT_DATE
; to a date with the year of your choice
WHERE DATE_TRUNC('YEAR', dstart)=DATE_TRUNC('YEAR', CURRENT_DATE)
GROUP BY DATE_TRUNC('MONTH', dstart)
还有其他方法可以执行此操作,但这应该可以解决您的基本问题,并且足以让您入门。例如,从此处,您还可以通过添加ORDER BY COUNT(idsub) DESC
按订阅数进行排序。
答案 2 :(得分:1)
我强烈建议这样编写查询:
SELECT DATE_TRUNC('month', dstart) as yyyymm COUNT(*) total
FROM Subscriptions
WHERE dstart >= DATE_TRUNC('year', now()) AND
dstart < DATE_TRUNC('year', now()) + INTERVAL '1 YEAR'
GROUP BY yyyymm
ORDER BY yyyymm;
此查询的重要组成部分是WHERE
子句。尽管dstart
看起来很复杂,但它不是函数的参数。这有助于优化程序,并允许优化程序使用列上的索引(如果有的话)。