MySQL SELECT和GROUPING

时间:2013-06-21 05:46:24

标签: mysql sql

我是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。 一些事情:

  1. 在这个例子中,我只有两个状态,但是数量     状态实际上是可变的
  2. 团队数量也是可变的
  3. 实际的group_names和tickets_statuses是其他的ID     我真实桌子上的桌子。 (但我可以弄清楚如何替代)
  4. 我已经尝试了一切我的想象力和有限的知识允许,甚至没有实现这一目标。任何帮助或指示都将受到高度赞赏。

    谢谢。

    [添加样本表结构(仅限相关字段)]

    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)'
    

2 个答案:

答案 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(PREPAREEXECUTE)。

您的基本脚本可能如下所示

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 演示。