0

我是stackoverflow的新手,我在尝试做主题时遇到了一些问题。报告。

表格示例

组客户属性
组 1 客户 1 属性 1
组 1 客户 1 属性 1
组 1 客户 2 属性 2
组 2 客户端 3 属性 1
组 3 客户端 4 属性 2
组 3 客户端 5 属性 2
组 3 客户端 5 属性 2
组 3 客户端 6 属性 3

注意:客户端和组列将作为此示例重复。

需要报告

组客户属性 1 属性 2 属性 3
Group1 Client1 是 否 否
Group1 Client2 否 是 否
Group2 Client3 是 否 否
Group3 Client4 否 是 否
Group3 Client5 否 是 否
Group3 Client6 否 否 是

主要的复杂性是我们需要逐个客户验证客户是否有或没有不同的属性。

我一开始就卡住了,我想是这样的:

SELECT
 group,
 client,
 CASE WHEN EXISTS
 (SELECT client FROM table
  WHERE client IN ( SELECT client FROM table
  WHERE Atribute = 3 ) -- The problem is that since there is an attribute for one of the    clients the subquery result true and will go to the "THEN" dor all the clients.
 ) THEN 'Yes' ELSE 'No' END AS Atribute3,
FROM
 table
GROUP BY group, client

任何帮助将不胜感激。原谅我的英语!最好的问候。

4

1 回答 1

0

您可以使用动态 SQL 来执行此操作

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
         CONCAT('MAX(CASE WHEN atribute = ''',
                atribute,
                ''' THEN ''yes'' ELSE ''no'' END) ',
                atribute))
  INTO @sql
  FROM table1;

SET @sql = CONCAT('SELECT `group`, client, ', @sql, ' 
                   FROM table1 
                   GROUP BY `group`, client');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

输出:

| 集团 | 客户 | 属性1 | 属性2 | 属性3 |
|--------|---------|------------|------------|------ -----|
| 组1 | 客户1 | 是的 | 没有 | 没有 |
| 组1 | 客户2 | 没有 | 是的 | 没有 |
| 组2 | 客户3 | 是的 | 没有 | 没有 |
| 组 3 | 客户4 | 没有 | 是的 | 没有 |
| 组 3 | 客户5 | 没有 | 是的 | 没有 |
| 组 3 | 客户6 | 没有 | 没有 | 是的 |

这是SQLFiddle演示

为了简化调用端的事情,您可以将其包装到存储过程中

DELIMITER $$
CREATE PROCEDURE sp_report()
BEGIN
  SET @sql = NULL;

  SELECT GROUP_CONCAT(DISTINCT
           CONCAT('MAX(CASE WHEN atribute = ''',
                  atribute,
                  ''' THEN ''yes'' ELSE ''no'' END) ',
                  atribute))
    INTO @sql
    FROM table1;

  SET @sql = CONCAT('SELECT `group`, client, ', @sql, ' 
                     FROM table1 
                     GROUP BY `group`, client');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

然后像这样使用它

CALL sp_report();

这是SQLFiddle演示

于 2013-08-28T04:28:17.420 回答