【问题标题】:SQL Server query date and amountSQL Server 查询日期和金额
【发布时间】:2020-11-23 12:23:10
【问题描述】:

我正在尝试创建一个基于以下信息的 SQL 查询。

我每天为文章购买和出售的金额。我正在尝试查询显示:

每个“月”每“文章”的总“金额”

“金额”应拆分为“正数”和“负数”,分别将所有正数“金额”和所有负数“金额”相加。

日期的格式为“yyyy-mm-dd 00:00:00.000”

我尝试了以下

SELECT article, date, SUM (amount) Total FROM shop group by FORMAT(date, 'yyyy_MM'), article

我收到以下消息

“日期在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中”

如果我从查询中取出日期,一切正常,它会计算总数。

【问题讨论】:

  • 由于没有样本数据,投票决定关闭。

标签: sql sql-server


【解决方案1】:

你需要一个所谓的 injective function 来处理你的日期:将一个月中的所有日期转换为相同值的方法,并且你需要在 both 中使用它您的 SELECT 和 GROUP BY 子句。 LAST_DAY() 是一个不错的功能。顺便说一句,DATE_FORMAT(date, '%Y-%m') 也是如此。

试试这个:

   SELECT article, LAST_DAY(date) month_ending, SUM (amount) Total 
     FROM shop
    GROUP BY LAST_DAY(date), article

有一个关于这个问题的一般解决方案here

【讨论】:

    【解决方案2】:

    MySQL 的原始答案

    你的查询主要有两个错误:

    1. FORMAT 是一个将数字转换为字符串的函数。因此,MySQL 会首先将您的日期转换为数字(这甚至不可能并引发错误,但 MySQL 确实会将其转换为某个数字)然后理解格式“yyyy_MM”,可能将 MM 表示为缅甸, 我不知道。我假设您每天获得不同的价值,而不是每月获得一个价值。你想要DATE_FORMAT(date, '%Y-%m')
    2. 您尝试按月分组,但随后显示日期。哪个日期?一个月最多有 31 个不同的日期。您必须改为显示分组依据的月份(即再次DATE_FORMAT(date, '%Y-%m'))。

    关于正负数的分离,可以使用条件聚合,即聚合函数中的CASE WHENSUM)。

    SELECT
      DATE_FORMAT(date, '%Y-%m') AS month,
      article,
      SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
      SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
    FROM shop
    GROUP BY DATE_FORMAT(date, '%Y-%m'), article
    ORDER BY DATE_FORMAT(date, '%Y-%m'), article;
    

    SQL Server 的更新答案

    在 SQL Server 中FORMAT(date, 'yyyy_MM') 一个从日期获取年月的函数。因此查询是:

    SELECT
      FORMAT(date, 'yyyy_MM') AS month,
      article,
      SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS positive_total,
      SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS negative_total
    FROM shop
    GROUP BY FORMAT(date, 'yyyy_MM'), article
    ORDER BY FORMAT(date, 'yyyy_MM'), article;
    

    【讨论】:

    • 我还需要按另一个定义“文章类型”的变量进行分组。因此,每篇文章都可能属于 2 种不同的“文章类型”。我只需要在“文章”之前添加“Groupy by”吗?
    • 是的,只需将类型添加到SELECTGROUP BYORDER BY 子句。
    • 我 gt 消息“DATE_FORMAT”不是可识别的内置函数名称?
    • 您已使用支持此功能的 DBMS MySQL 标记您的请求(请参阅dev.mysql.com/doc/refman/8.0/en/…)。如果您收到此错误,您可能正在使用其他一些 DBMS。甲骨文? SQL 服务器? PostgreSQL? ...
    • 我使用 SQL Server Management Studio..对不起