【问题标题】:SQL String Troubles with Multiple Functions多个函数的 SQL 字符串问题
【发布时间】:2015-05-13 02:22:45
【问题描述】:

我正在使用连接到 Visual Basic 的本地 Access 数据库。我的查询是

SELECT RebateReceived, DatePart('yyyy',[RebateMailedDate]) AS MailedDate, Sum(RebateValue) as MoneyReceived
    FROM RebateInfoStorage
    where RebateReceived='Received'
    group by RebateReceived
    having DatePart('yyyy',[RebateMailedDate])

我正在尝试获取具有相同年份的列和“已收到”的单词,以识别需要汇总(添加)在一起的记录。我对Group ByHaving 关键字或Sum()DatePart() 函数不是很熟悉。

【问题讨论】:

    标签: sql vb.net ms-access jet


    【解决方案1】:

    因此,DBMS 将进入 RebateInfoStorage 并获取 RebateReceived = 'Received' 所在的所有行。然后,它将这些记录分组,其中每个组包含表达式 DatePart('yyyy', RebateMailedDate) 计算结果相同的记录(即它们具有相同的年份)。然后对于每个组,它将返回一个带有年份的结果行,以及该组中所有RebateValues 的总和。操作按此顺序进行。

    HAVING 类似于 WHERE,但发生在 GROUP BY 之后,是放置在一组记录上的条件,而 WHERE 是记录上的条件。

    SELECT
      YEAR(RebateMailedDate) AS MailedDate,
      SUM(RebateValue) as MoneyReceived
    FROM
      RebateInfoStorage
    WHERE
      RebateReceived = 'Received'
    GROUP BY
      YEAR(RebateMailedDate);
    

    编辑:看起来 YEAR(x) 是一个更合适的函数!

    【讨论】:

    • DatePart('yyyy', RebateMailedDate)YEAR(RebateMailedDate) 都将返回相同的整数值。是什么让Year() 成为更合适的功能?
    • 该函数现在以更简洁的方式准确地说明了您所追求的:年份。代码对读者来说更清楚。
    【解决方案2】:

    您应该按具有 RebateReceived='Received' 的 DatePart 分组。更多关于Have you的语法可以参考http://www.w3schools.com/sql/sql_having.asp

    分组方式意味着您的输出表将根据该列中的唯一元素进行分组。例如,如果有多个条目以 2014 为年份,它们将被组合在一起,它们的 RebateValue 将被加在一起。如果您使用 RebateReceived 进行分组,则所有条目都将被添加,您最终将得到一个总和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2014-03-15
      • 2017-08-26
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多