【问题标题】:SQL - count values by dateSQL - 按日期计算值
【发布时间】:2021-05-06 09:55:42
【问题描述】:

我需要一个 sql 代码编辑。我需要按月计算 x 和 y 值。我怎样才能得到它?

我的代码是

> SELECT DISTINCT TR_TYPE, ORDER_NO FROM INVENTORY WHERE TRANS_TYPE IN
> ('X', 'Y') AND CREATED_DATE BETWEEN '01-JUL-20' AND '01-DEC-20'

我想看到类似的东西:

Jul : 30
Aug : 60
..
Dec : 27

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 甲骨文。我不擅长 sql。对不起我的不好。

标签: sql date count


【解决方案1】:

您的代码表明您正在使用 Oracle。在那个数据库中,我会推荐:

SELECT TRUNC(CREATED_DATE, 'MON') as month, COUNT(*) as cnt,
       SUM(CASE WHEN TRANS_TYPE = 'X' THEN 1 ELSE 0 END) as x_cnt,
       SUM(CASE WHEN TRANS_TYPE = 'Y' THEN 1 ELSE 0 END) as y_cnt
FROM INVENTORY
WHERE TRANS_TYPE IN ('X', 'Y') AND
      CREATED_DATE >= DATE '2020-07-01' AND
      CREATED_DATE < DATE '2020-12-01'
GROUP BY TRUNC(CREATED_DATE, 'MON')
ORDER BY month;

注意事项:

  • 日期常量使用标准方法插入日期常量。
  • 日期比较不使用BETWEEN。这是一种误导,因为 BETWEEN 包含 both 端点。此版本更准确,并且无论日期是否包含时间组件都有效。
  • GROUP BY 键是截断到月初的完整日期。这比提取月份要安全得多,尤其是当您的日期范围超过一年时。
  • 它还分别添加了“X”和“Y”的计数。如果您想要这个,您的问题有点不清楚(文本建议样本结果“是”,“否”)。

【讨论】:

  • 它看起来很完美,但我想知道“独特”一词在哪里。我不想计算重复的行。
  • @sabredin 。 . . group by 负责处理。
【解决方案2】:

你需要使用group bycount如下:

SELECT MONTH(TR_TYPE) AS month_, count(*) as cnt
  FROM INVENTORY
 WHERE TR_TYPE>= '2020-07-01'
   AND TR_TYPE<= '2020-08-01'
   AND TRANS_TYPE IN ('X', 'Y')
GROUP BY MONTH(TR_TYPE)

【讨论】:

    【解决方案3】:

    我相信你可以通过 count(*) 进行分组,类似这样:

    SELECT MONTH(TR_TYPE) AS m, count(*)
    FROM INVENTORY
    WHERE TR_TYPE>= '2020-07-01'
    AND TR_TYPE<= '2020-08-01'
    GROUP BY m
    

    【讨论】:

    • 没有“distinct”,这不是问题吗?
    • 如果你只是添加不同的,我相信没关系
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多