我是SQL(mySQL)的新手,我正在尝试创建一个专门填充谷歌图表的查询 结果应如下所示:
['group_name', 'Open_tickets_count', 'closed_tickets_count'],
['Team A', 10, 400],
['Team B', 30, 460],
['Team C', 66, 1120],
['Team D', 5, 540]
我有一个包含以下字段的票证表:id ticket_status group_name。 一些事情:
我已经尝试了一切我的想象力和有限的知识允许,甚至没有实现这一目标。任何帮助或指示都将受到高度赞赏。
谢谢。
[添加样本表结构(仅限相关字段)]
Table: tickets
'id', 'int(10)'
'ticket_status_id', 'int(10)'
'ticket_group_id', 'int(10)'
Table: status
'id', 'int(10)'
'name', 'varchar(250)'
Table: groups
'id', 'int(10)'
'name', 'varchar(250)'
答案 0 :(得分:1)
让我们按照你的假设去做。
您可以尝试类似
的内容SELECT group_name,
SUM(CASE WHEN ts.status = 'OPEN' THEN 1 ELSE 0 END) Open_tickets_count
SUM(CASE WHEN ts.status = 'CLOSED' THEN 1 ELSE 0 END) closed_tickets_count
FROM tickets t INNER JOIN
ticket_statusses ts ON t.ticket_status = ts.id
GROUP BY group_name
您必须为不同的状态添加新列。
答案 1 :(得分:1)
为了实现您的目标,您需要使用带有SUM()
的条件GROUP BY
和动态SQL(PREPARE
,EXECUTE
)。
您的基本脚本可能如下所示
SET @sql = '';
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN t.ticket_status = ''',
id,
''' THEN 1 ELSE 0 END) `',
name, '`'
)
) INTO @sql
FROM
status;
SET @sql = CONCAT
('SELECT g.name, ', @sql, '
FROM tickets t JOIN status s
ON t.ticket_status = s.id JOIN groups g
ON t.ticket_group_id = g.id
GROUP BY t.ticket_group_id, g.name'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这是 SQLFiddle 演示。