【问题标题】:Group by newly created column in SQL按 SQL 中新创建的列分组
【发布时间】:2023-03-10 09:18:01
【问题描述】:

我创建了一个以另一列 TYPE 为条件的列。 TYPE=IN 时为 -1,TYPE=OUT 时为 1。

SELECT *, 
  CASE TYPE
     WHEN 'IN' THEN -1 
     WHEN 'OUT' THEN 1
  END AS TYPE_NUMERIC

FROM `SALES_TABLE` 

表格如下:

ID     DATE         TYPE      QTY  

X100   2010-11-02   IN        1000
X100   2010-11-02   OUT       1000
X100   2010-11-02   OUT       1000
X100   2010-11-02   IN        1000
X100   2010-11-04   IN        1000
       ...

如何按IDQTY对数据进行分组,然后求和TYPE_NUMERIC,选择最早Datecount行数每个组?

以上面的示例表为例,预期输出应如下所示:

ID     QTY    SUM_TYPE_NUMERIC  first_DATE         TYPE      count_rows

X100   1000   0                 2010-11-02         IN        4
X100   1000   -1                2010-11-04         IN        1

非常感谢任何建议。

【问题讨论】:

  • 一个给定的日期可以有多个 IN 或 OUT 吗?
  • 嗨@TimBiegeleisen,是的,这是可能的
  • 然后添加反映实际问题的样本数据。
  • 刚刚添加了更多示例数据@TimBiegeleisen

标签: sql group-by


【解决方案1】:

试试这个:

SELECT
    `ID`,
    `QTY`,
    SUM(IF(`TYPE` = 'IN', -1, IF(`TYPE` = 'OUT', 1, 0))) AS SUM_TYPE_NUMERIC,
    MIN(`DATE`) AS first_DATE,
    COUNT(*) AS count_rows
FROM `SALES_TABLE`
GROUP BY `ID`, `QTY`

如果不能使用 IF() 语句的替代方案:

A- 直接存储 -1 和 1 而不是 'IN' 和 'OUT'。这样,您的查询将被简化:

SELECT
    `ID`,
    `QTY`,
    SUM(`TYPE`) AS SUM_TYPE_NUMERIC,
    MIN(`DATE`) AS first_DATE,
    COUNT(*) AS count_rows
FROM `SALES_TABLE`
GROUP BY `ID`, `QTY`

B- 添加一个字段 TYPE_NUMERIC,其中包含 -1 AND 1 值(根据其 TYPE 值将此值分配给每个寄存器)。最后,我们的查询将是:

SELECT
    `ID`,
    `QTY`,
    SUM(`TYPE_NUMERIC`) AS SUM_TYPE_NUMERIC,
    MIN(`DATE`) AS first_DATE,
    COUNT(*) AS count_rows
FROM `SALES_TABLE`
GROUP BY `ID`, `QTY`

C- 添加一个表TYPES,其中包含字段TYPE AND TYPE_NUMERIC,它将包含两个寄存器:('IN', -1) 和 ('OUT', 1) .这是 B 选择的归一化。这样,您就可以在查询中使用该表和 TYPE_NUMERIC 值:

SELECT
    s.`ID`,
    s.`QTY`,
    SUM(t.`TYPE_NUMERIC`) AS SUM_TYPE_NUMERIC,
    MIN(s.`DATE`) AS first_DATE,
    COUNT(*) AS count_rows
FROM `SALES_TABLE` s
JOIN `TYPES` t ON t.`TYPE` = s.`TYPE`
GROUP BY s.`ID`, s.`QTY`

【讨论】:

  • 您好何塞,谢谢您的回答。但是它发现了错误:Incorrect syntax near the keyword 'IF'.
  • 你在使用MySql吗? IF() 在 MySql 中可用,但在您的数据库引擎中可能不可用。也许您需要一个数字字段来生成 SUM(),我不知道是否可以使用 CASE。
  • 嗨,何塞,不,我正在使用 SQL。
  • @nilsinelabore 我编辑了我的答案添加了替代方案。
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2020-12-20
  • 2021-12-13
相关资源
最近更新 更多