【问题标题】:Getting sum of a column that needs a distinct value from other column获取需要与其他列不同的值的列的总和
【发布时间】:2021-09-07 10:26:01
【问题描述】:

我有这张表,我想在其中获取 balance 列的总和,但每个项目都应该具有来自 date 列的唯一值。

我正在尝试查找balance 列中所有相同且具有相同date 的行,然后找到balance 列的总和。

具有唯一日期的样本数据:

balance date
700 2021-07-03
700 2021-09-03
300 2021-09-04
500 2021-09-05

使用的查询如下:

select distinct a.balance, a.date from table a where a.date between (some date) and (some other date)

我试过了:

select sum(a.balance), a.date from table a where a.date between (some date) and (some other date) group by a.date

balance 列显示了该列中所有值的总和,但显示了不同的日期,如下所示。

balance date
893938 2021-07-03
858585 2021-09-03
728366 2021-09-04
665322 2021-09-05

【问题讨论】:

  • (1) MySQL Oracle。请正确标记。 (2)。你的GROUP BY 应该做正确的事。 (3) 也许您的样本数据实际上并不能说明您想要做什么。 858585 来自哪里?
  • 858585 是余额列中日期为 2021-09-03 的所有值的总和。我将编辑我的问题。
  • 显示测试用例的实际原始数据。您可能有 100 行包含某个日期的 700 余额。尝试以下操作以更好地理解数据:select a.balance, a.date, COUNT(*) AS n from table a where <some criteria> GROUP BY a.balance, a.date;
  • 如果您只需要SUM 中的DISTINCT 每个日期的余额,您可以:SELECT a.date, SUM(DISTINCT balance) AS dbal FROM tbl a ... GROUP BY a.date; 我不知道您为什么要这样做。但这就是它可以做到的方式。
  • SUM 余额之前,您应该非常小心,您通常会将交易金额相加,但是不是余额....

标签: sql oracle


【解决方案1】:

我想这是一个子查询的工作。因此,让我们一步一步解决您的问题。

我正在尝试查找余额列中所有相同且日期相同的行,

我相信,这个子查询会让你明白。它给出与 SELECT DISTINCT 相同的结果,但它也会计算重复的行数。

                SELECT COUNT(*) num_same_rows, balance, date
                  FROM `table`
                 WHERE a.datum BETWEEN '2021-01-01' AND '2021-09-01'
                 GROUP BY date, balance

然后求余额列的总和。

像这样嵌套子查询。

SELECT SUM(balance) summed_balance, date
  FROM (
                SELECT COUNT(*) num_same_rows, balance, date
                  FROM `table`
                 WHERE a.datum BETWEEN '2021-01-01' AND '2021-09-01'
                 GROUP BY date, balance
       ) subquery
 GROUP BY date

如果您只想考虑实际上有重复的行,请将您的子查询更改为

                SELECT COUNT(*) num_same_rows, balance, date
                  FROM `table`
                 WHERE a.datum BETWEEN '2021-01-01' AND '2021-09-01'
                 GROUP BY date, balance
                HAVING COUNT(*) >= 1

不过,这里要小心。你没有告诉我们你想做什么,只是如何告诉我们你想做什么。您描述问题的方式要求在求和之前丢弃重复的数据。是对的吗?是否要丢弃数据?

【讨论】:

  • 基本上,我要做的是在balance 列中查找具有相似date 的重复项并找到它们的总和。
【解决方案2】:

您发布的第二个查询看起来不错 - 有点。

但是,我认为事实上,日期列不仅包含日期,还包含时间(就像 Oracle 中的 DATE 数据类型一样)。因此,我会说您需要的是trunc。像这样的:

  SELECT TRUNC (a.datum) datum,
         SUM (a.balance) sum_balance
    FROM table_a a
   WHERE a.datum BETWEEN DATE '2021-01-01' AND DATE '2021-09-01'
GROUP BY TRUNC (a.datum)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多