目前我正在使用 mysql 返回具有相同单词的列中所有数据的总和。为此,我使用以下查询:
SELECT SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft,
SUM(CASE WHEN status_to = 'Unpublish' THEN 1 END) AS unpublish,
SUM(CASE WHEN status_to = 'Publish' THEN 1 END) AS publish,
SUM(CASE WHEN status_to = 'Action' THEN 1 END) AS action,
SUM(CASE WHEN status_to = 'Unlisted' THEN 1 END) AS unlisted,
SUM(CASE WHEN status_to = 'Sold' THEN 1 END) AS sold,
SUM(CASE WHEN status_to = 'Let' THEN 1 END) AS let
FROM `crm_logs`
这会在我的数据库中为我指定的所有术语提供正确的输出,但现在我发现数据库中除了上面指定的变量之外还有更多的状态变量。所以我想要一种方法来拥有与该语句相同的功能,但使状态变量动态化。
基本上,如果这是查询,SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft
则草稿的出现都应该是动态的。
编写一个存储过程,使用 和 构造查询并
CONCAT()
执行它。PREPARE
EXECUTE
或者使用其字符串函数以您的应用程序语言构建查询。
至于维基答案中的讨论,我添加了这个
status_to
但这只有在可能的情况下才有必要NULL
。否则,这有效:有一种更简单的方法可以做你想做的事——我昨晚在想这个——在这里看我的第二把小提琴。
您可以执行以下操作(下面的所有代码都可以在此处的小提琴中找到):
然后填充它:
请注意,我添加了 2 个单例值 (
Single_1
和Single_2
) 来检查如何计算DISTINCT
表中大于 1 条记录的值......使用“经典”SQL 时要困难得多 - 使用窗口函数,它是很容易。新的“简单”查询是:
(新)结果:
注意这个新查询和我的旧查询的小提琴底部结果的极端差异!
EXPLAIN ANALYZE
此查询演示了如何轻松挑选出具有多个记录的
DISINCT
值:status_to
结果:
8 = 10(总计)减去 2 个单例!
我还包括了这个 SQL——它可以让你轻松地(手动)计算
UNIQUE
条目的数量。结果:
我在第二个小提琴中留下了更多的片段——如果你真的想了解 SQL,我会邀请你看看新旧版本,并尝试使用 PostgreSQL 运行代码——这很有趣!
DISTINCT
最后,如果您希望使用所有值及其s动态构造一行(根据您的原始问题)COUNT()
,那么您可以使用某种形式的RECURSIVE CTE
- 但这是另一个问题!jkavalik:您应该改为:
它有行而不是列的数据,但这是一个细节。如果确实需要,也可以使用动态 SQL 来解决,但group by作为基础查询仍然更好。
Akina:在 MySQL 中,您可能使用的不是
SUM(CASE WHEN status_to = 'Draft' THEN 1 END)
但更简单(和清晰)SUM(status_to = 'Draft')
。此外,如果没有匹配的行,此表达式将生成零而不是 NULL。
count(status_to = 'Draft')
无论值如何,都会计算所有非空值。仅当不存在非空值时SUM(status_to = 'Draft')
才会产生空status_to
值。Lennart :
count(nullif(status_to = 'Draft',0))
会处理这两种情况。