用于合并两个表并将行转换为列的SQL脚本

时间:2016-01-11 16:25:54

标签: mysql sql

我有两张桌子:

CREATE TABLE IF NOT EXISTS `tools` (
  `pk_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `title` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`pk_id`));

CREATE TABLE IF NOT EXISTS `features` (
  `pk_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `feature` varchar(13) DEFAULT NULL,
  `number` int(11),
  PRIMARY KEY (`pk_id`),
  FOREIGN KEY (id) REFERENCES tools(id));

然后我有脚本(见下文)来获得这样的东西:

Tools  Feature1 Feature2 Feature3 Feature4
=========================================
ToolA  1        0        0        1
ToolB  0        0        1        0

当我在行1中添加number而不是MAX(IF(pa1.feature = "', feature,'", "', number, '", "', 0, '"))时,脚本运行正常。否则它表示此行存在一些错误。为什么以及如何解决它?

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(pa1.feature = "', feature,'", "', number, '", "', 0, '")) AS ', REPLACE(feature, ' ', '')
    )
  ) INTO @sql
FROM features;

SET @sql = CONCAT('SELECT p.id
                    , p.title
                    , ', @sql, ' 
                   FROM tools p
                   LEFT JOIN features AS pa1 
                    ON p.id = pa1.id
                   GROUP BY p.id');

SELECT concat('SQL: ', @sql);

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

更新

这是由上述脚本创建的原始SQL语句,其中包含一些错误:

  

SELECT p.id \ n,p.title \ n,MAX(IF(pa1.feature = \" feature 68 \",\" 6 \",\ " 0 \"))AS   feature68,MAX(IF(pa1.feature = \" feature 68 \",\" 7 \",\" 0 \"))AS   feature68,MAX(IF(pa1.feature = \" feature 68 \",\" 1 \",\" 0 \"))AS   feature68,MAX(IF(pa1.feature = \" feature 172 \",\" 2 \",\" 0 \"))AS   feature172,MAX(IF(pa1.feature = \" feature 56 \",\" 1 \",\" 0 \"))AS   feature56,MAX(IF(pa1.feature = \" feature 193 \",\" 4 \",\" 0 \"))AS   feature193,MAX(IF(pa1.feature = \" feature 71 \",\" 3 \",\" 0 \"))AS   feature71,MAX(IF(pa1.feature = \" feature 201 \",\" 2 \",\" 0 \"))AS   feature201,MAX(IF(pa1.feature = \" feature 80 \",\" 2 \",\" 0 \"))AS   feature80,MAX(IF(pa1.feature = \" feature 203 \",\" 5 \",\" 0 \"))AS   feature203,MAX(IF(pa1.feature = \" feature 82 \",\" 8 \",\" 0 \"))AS   feature82,MAX(IF(pa1.feature = \" feature 80 \",\" 9 \",\" 0 \"))AS   feature80,MAX(IF(pa1.feature = \" feature 82 \",\" 9 \",\" 0 \"))AS   feature82,MAX(IF(pa1.feature = \" feature 201 \",\" 5 \",\" 0 \"))AS   feature201,MAX(IF(pa1.feature = \" feature 80 \",\" 15 \",\" 0 \"))AS   feature80,MAX(IF(pa1.feature = \" feature 56 \",\" 3 \",\" 0 \"))AS   feature56,MAX(I \ n FROM tools p \ n
  LEFT JOIN功能AS pa1 \ n ON p.id = pa1.id \ n
  GROUP BY p.id

正如我所说,如果我用number替换1,那么相同的代码也可以。

1 个答案:

答案 0 :(得分:0)

我发现您发布的代码存在两个问题。

  • 在sql字符串中通常使用单引号而不是双引号指定。我不是100%使用mysql,因此该平台可能允许您拥有此处的代码。

  • 查看最后一个字段MAX(I \n FROM tools这显然是错误的。

这可能是两件事之一。 @SQL是小的,或者数字列中有空。如果问题是你有一个null,那么这将修复将在你的select语句中使用它。

FROM features
WHERE number is not null;