【问题标题】:Making SQL query dynamic使 SQL 查询动态化
【发布时间】:2022-01-22 15:06:19
【问题描述】:

我有以下 SQL 查询,我想知道是否可以将 SUM() 部分设为动态,这样我就不必输入 category_id(2 和 3)

SELECT 
a.project_id,
COUNT(a.id) AS Total,
SUM(CASE WHEN a.category_id = 2 AND a.`status` < 80 THEN 1 ELSE 0 END) AS 'Bugs En cours',
SUM(CASE WHEN a.category_id = 2 AND a.`status` >= 80 THEN 1 ELSE 0 END) AS 'Bugs Resolu',
SUM(CASE WHEN a.category_id = 3 AND a.`status` < 80 THEN 1 ELSE 0 END) AS 'Ameliorations En cours',
SUM(CASE WHEN a.category_id = 3 AND a.`status` >= 80 THEN 1 ELSE 0 END) AS 'Ameliorations Resolu'
FROM bugs a 
GROUP BY a.project_id
HAVING COUNT(a.id) > 0 

目标是根据category_idstatus('En cours' OR 'Resolu')列出不同异常的project idcount

这个查询的问题是,如果我们添加了另一个类别,我将不得不手动编辑这个查询,这并不理想。

【问题讨论】:

  • 为什么不直接将这些类别/状态映射放在一个表中,而不是在查询文本中散布枚举字符串?
  • 很遗憾,我不知道表格的结构。
  • 当然,但这是您可以向这样做的人提供的反馈。
  • 创建一个基于 bug 中的 category_ids 的动态查询并不难,所以如果出现新类别,这不会是一个问题,除非查询不知道应该附加什么标签如果查询应该显示新类别的出现位置但没有出现在错误中,那么它也无法做到这一点。因此,除非您可以说服您的情况下添加表格的权力,否则您似乎无法进行手动更改。..

标签: mysql sql group-by pivot dynamic-sql


【解决方案1】:

下面的动态 sql 正在使用类别的参考表构建条件总和。

SET @sums := (
SELECT GROUP_CONCAT(
CONCAT(
', SUM(CASE WHEN category_id = ', category_id, 
' AND `status` <  80 THEN 1 ELSE 0 END)', 
' AS `', category_name, ' En cours`', CHAR(10),
', SUM(CASE WHEN category_id = ', category_id, 
' AND `status` >= 80 THEN 1 ELSE 0 END)',
' AS `', category_name, ' Resolu`', CHAR(10)
) ORDER BY category_id SEPARATOR '') as sums
FROM categories
);

SET @dynsql := CONCAT('SELECT', CHAR(10), '  bug.project_id', CHAR(10),
', COUNT(bug.id) AS Total', CHAR(10),
@sums, 
'FROM bugs bug', CHAR(10),
'GROUP BY bug.project_id', CHAR(10),
'HAVING COUNT(bug.id) > 0;');

-- SELECT @dynsql AS dynsql;
PREPARE dyn_stmt FROM @dynsql;
EXECUTE dyn_stmt;
DEALLOCATE PREPARE dyn_stmt;
project_id Total Conneries En cours Conneries Resolu Bugs En cours Bugs Resolu Ameliorations En cours Ameliorations Resolu
0 5 1 0 1 1 1 1

dbfiddle here

上的演示

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2019-07-15
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多