数据透视表只返回 1 行

Posted

技术标签:

【中文标题】数据透视表只返回 1 行【英文标题】:Pivoting table only returns 1 row 【发布时间】:2013-11-15 19:39:16 【问题描述】:

我的 SQLFiddle:http://sqlfiddle.com/#!2/729a9/1

如您所见,尽管表中有两行,但返回了一行。

也是最高的id,可能跟这个有关系吧?

对不起,我被难住了。

SQL:

SELECT GROUP_CONCAT(distinct
             CONCAT(
              'max(case when `pat`.`name` = ''',
               `pat`.name,
               ''' then `pa`.`value` end) as `',
               `pat`.name, '`'
              )
            ) INTO @list 
FROM `product_attribute_types` pat;

SET @sql = CONCAT('select ', @list, ' 
                  from `products`  `p` 
                  LEFT JOIN `product_attributes` `pa` 
                    ON `p`.id=`pa`.`product_id`
                  LEFT JOIN `product_attribute_types` `pat`
                        ON `pa`.`type`=`pat`.`id`
                  ');

PREPARE stmt FROM @sql;
EXECUTE stmt;

【问题讨论】:

我必须说,您删除之前的问题是不公平的,该问题的回答只是为了重新发布该问题的新版本并进行了更改。如果您的要求发生变化,那么您应该向答案的作者发表评论或发布新问题。删除和重新发布非常粗鲁 - 仅限 10k 用户 -- ***.com/questions/19775409/… 您的小提琴中的products 表是否正确?您拥有相同产品 ID 的蓝色裤子和绿色衬衫。 您应该将product_id, type 设为product_attributes 中的唯一键,以防止出现此问题。 【参考方案1】:

首先:同一个product_id = 1,你有两个属性,用这种方式更改表product_attributes -

INSERT INTO `product_attributes` (`product_id`,`type`,`value`) VALUES
  (1,1,'blue'),
  (1,2,'shirt'),
  (2,1,'green'),
  (2,2,'pants');

那就试试这个-

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(pat.name = ''', name, ''', pa.value, NULL)) AS ', name
    )
  ) INTO @sql
FROM product_attribute_types;

SET @sql = CONCAT('SELECT pa.product_id, ', @sql, ' FROM product_attributes pa INNER JOIN product_attribute_types pat ON pa.type = pat.id GROUP BY pa.product_id');

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

结果:

+------------+-------+-------+
| product_id | color | name  |
+------------+-------+-------+
|          1 | blue  | shirt |
|          2 | green | pants |
+------------+-------+-------+

如果需要,添加 WHERE 过滤器。

【讨论】:

【参考方案2】:

@sql 中缺少 GROUP BY 子句,以及该行引用的产品 ID。

SET @sql = CONCAT('select p.id, ', @list, ' 
                  from `products`  `p` 
                  LEFT JOIN `product_attributes` `pa` 
                    ON `p`.id=`pa`.`product_id`
                  LEFT JOIN `product_attribute_types` `pat`
                        ON `pa`.`type`=`pat`.`id`
                  GROUP BY p.id
                  ');

FIDDLE

【讨论】:

仍然不行,他们想在颜色下显示绿色和蓝色——其他列的等等——你的回报是空的——sqlfiddle.com/#!2/729a9/27——小提琴显示很难相同查询的编码版本。 我不明白,您要求每个属性的 MAX,这意味着您将始终只返回 1 行。 @bluefeet 请看我上面的评论——我认为他的products 表中有错误的数据。 @Barmar 相信我,我理解旋转的概念。他们不需要不同的产品编号,他们需要让行独一无二的东西。在 SQL Server 中,它将是按产品 ID 分区的行号 这很有趣,考虑到以下Top :-)。

以上是关于数据透视表只返回 1 行的主要内容,如果未能解决你的问题,请参考以下文章

用于计算唯一值的简单数据透视表

Excel 请问资料透视表如何去掉汇总行

快速取消数据透视表的分类汇总行和总计行

如何删除透视表中的很多汇总行

Excle数据透视表如何禁用数据透视表的总计行/列

PowerQuery处理透视表总计行不能自定义计算