我创建了一个以另一列TYPE为条件的列。-1次TYPE=IN,1次TYPE=OUT。
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
...如何将数据按ID和QTY分组,然后和TYPE_NUMERIC,选择最早的 Date,计数每个组中的行数?
使用上面的示例表作为示例,预期的输出应该如下所示:
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任何建议都是非常感谢的。
发布于 2021-11-02 03:17:01
试试这个:
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`TYPE_NUMERIC B-使用-1和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`TYPES -添加一个带有字段TYPE和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`https://stackoverflow.com/questions/69804700
复制相似问题