sql - COUNT 总数(按每周和每月 SQL)

标签 sql sql-server database

我有一个表格,我必须在其中计算每天、每周和每月分配给每个用户的总行数。

已发行表书

BOOKID    ISSUEDUSER    DATE
 1            A        20160708
 2            A        20160709
 3            A        20160708
 4            A        20150102
 5            B        20160709
 6            C        20160708
 7            C        20160708

现在我必须计算每天、每周和每月发给每个用户的图书

今天是每日 (20160709) 每周是周日到周六 每月是整月

结果应该是

ISSUEDUSER    DAILYBOOKS WEEKLYBOOKS  MONTHLYBOOKS
  A               1       3           3
  B               1       1           1
  C               0       2           2

我已经为每日发布完成了这个SQL

SELECT ISSUEDUSER, COUNT(BOOKID) AS DAILYBOOKS
FROM BOOKSISSUED
WHERE DATE = CONVERT(VARCHAR(11), SYSDATETIME(), 112)
GROUP BY ISSUEDUSER

谁能帮我为所有这三个编写一个组合 SQL?

谢谢

艾登

最佳答案

您可能需要添加 WHERE 子句以仅检索当月的记录

SELECT ISSUEDUSER, 
       SUM(CASE WHEN DATE = DATEADD(DAY, DATEDIFF(DAY, 0, SYSDATETIME()), 0))
                THEN 1 ELSE 0 END) AS DAILYBOOKS,
       SUM(CASE WHEN DATE >= DATEADD(WEEK, DATEDIFF(WEEK, 0, SYSDATETIME()), 0)
                AND  DATE <  DATEADD(WEEK, DATEDIFF(WEEK, 0, SYSDATETIME()) + 1, 0)
                THEN 1 ELSE 0 END) AS WEEKLYBOOKS,
       COUNT(*) AS MONTHLYBOOKS
FROM   BOOKSISSUED
WHERE  DATE >= DATEADD(MONTH, DATEDIFF(MONTH, 0, SYSDATETIME()), 0)
AND    DATE <  DATEADD(MONTH, DATEDIFF(MONTH, 0, SYSDATETIME()) + 1, 0)
GROUP BY ISSUEDUSER

编辑:[DATE] 列是 INT

SELECT ISSUEDUSER, 
       SUM(CASE WHEN DATE = CONVERT(INT, CONVERT(VARCHAR(8), SYSDATETIME(), 112))
                THEN 1 ELSE 0 END) AS DAILYBOOKS,
       SUM(CASE WHEN DATE >= CONVERT(INT, CONVERT(VARCHAR(8), DATEADD(WEEK, DATEDIFF(WEEK, 0, SYSDATETIME()), 0), 112))
                AND  DATE <  CONVERT(INT, CONVERT(VARCHAR(8), DATEADD(WEEK, DATEDIFF(WEEK, 0, SYSDATETIME()) + 1, 0), 112))
                THEN 1 ELSE 0 END) AS WEEKLYBOOKS,
       COUNT(*) AS MONTHLYBOOKS
FROM   BOOKSISSUED
WHERE  DATE >= CONVERT(INT, CONVERT(VARCHAR(6), SYSDATETIME(), 112) + '01')
AND    DATE <  CONVERT(INT, CONVERT(VARCHAR(6), DATEADD(MONTH, 1, SYSDATETIME()), 112) + '01')
GROUP BY ISSUEDUSER

关于sql - COUNT 总数(按每周和每月 SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38279060/

相关文章:

php - 需要有关 sql 注入(inject)的帮助

sql - 在 SSIS 中将月份名称更改为月份编号

sql - ORA-02287 此处不允许序列号

sql - 我可以牺牲一致性来允许并发 'insert or update' 和使用 SQL Server 对单个表进行读取访问吗?

mysql - sql自连接和多对多关系

带约束的 Mysql 查询出现错误

c# - 将 DateTime 与数据库中存储的日期进行比较

sql-server - 如何通过查询获取基于日期的每小时计数?

sql - 空值处理

database - Cassandra 时间序列 : Allow Filtering, 桶或其他