Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用“将列转换为行”|&引用;作为分离器_Mysql_Sql_Max_Group Concat - Fatal编程技术网

Mysql 使用“将列转换为行”|&引用;作为分离器

Mysql 使用“将列转换为行”|&引用;作为分离器,mysql,sql,max,group-concat,Mysql,Sql,Max,Group Concat,请看一下这个 我想将此表中的每个字段转换为一行: CREATE TABLE product (`ID` int, `name` varchar(1), `category` varchar(11), `price` int,`year`int) ; INSERT INTO product (`ID`, `name`, `category`, `price`,`year`) VALUES (1, 'A', 'Outdoor', 25,2010), (2, 'A',

请看一下这个

我想将此表中的每个字段转换为一行:

CREATE TABLE product
    (`ID` int, `name` varchar(1), `category` varchar(11), `price` int,`year`int)
;

INSERT INTO product
    (`ID`, `name`, `category`, `price`,`year`)
VALUES
    (1, 'A', 'Outdoor', 25,2010),
    (2, 'A', 'Doll', 34,2009),
    (3, 'C', 'Doll', 25,2008),
    (4, 'D', 'Outdoor', 20,2010),
    (5, 'E', 'Brainteaser', 22,2010),
    (6, 'E', 'Brainteaser', 22,2009),
    (7, 'G', 'Brainteaser', 30,2009),
    (8, 'G', 'Brainteaser', 30,2009)
;
以下是我试图获得的输出:

field           value
name            A,C,D,E,G
category        Brainteaser,Doll,Outdoor
price           20,22,25,30,34
year            2008,2009,2010
我读了一篇关于使用
UNION
MAX
旋转数据透视表的文章,但在使用
MAX
GROUP\u CONCAT

   SELECT 
    MAX(CASE WHEN ... GROUP_CONCAT(DISTINCT (value) SEPARATOR '|')) as value
    from(
    select id,name value, 'name' field
    from product
    union all
    select id,category value, 'category' field 
    from product
    union all
    select id,price value, 'price' field
    from product
    union all
    select id,year value, 'year' field
    from product
      )
    GROUP BY field
    order by value

有人能告诉我如何获得输出吗

这将为您提供预期的输出:

SELECT 'name' AS `field`. GROUP_CONCAT(DISTINCT `name`  ORDER BY `name`) AS `value`
FROM product
UNION ALL
SELECT 'category' AS `field`. GROUP_CONCAT(DISTINCT `category` ORDER BY `category`) AS `value`
FROM product
UNION ALL
SELECT 'price' AS `field`. GROUP_CONCAT(DISTINCT `price` ORDER BY `price`) AS `value`
FROM product
UNION ALL
SELECT 'year' AS `field`. GROUP_CONCAT(DISTINCT `year` ORDER BY `year`) AS `value`
FROM product

添加了ORDER BY,因为您需要排序的输出

这将为您提供预期的输出:

SELECT 'name' AS `field`. GROUP_CONCAT(DISTINCT `name`  ORDER BY `name`) AS `value`
FROM product
UNION ALL
SELECT 'category' AS `field`. GROUP_CONCAT(DISTINCT `category` ORDER BY `category`) AS `value`
FROM product
UNION ALL
SELECT 'price' AS `field`. GROUP_CONCAT(DISTINCT `price` ORDER BY `price`) AS `value`
FROM product
UNION ALL
SELECT 'year' AS `field`. GROUP_CONCAT(DISTINCT `year` ORDER BY `year`) AS `value`
FROM product

添加了排序依据,因为看起来您需要排序的输出

类似的东西??使用union all以获得更好的形式,并防止出现任何重复

SELECT 'name' field, group_concat(DISTINCT name ORDER BY name SEPARATOR '|') value FROM product
UNION ALL
SELECT 'category' field, group_concat(DISTINCT category ORDER BY category SEPARATOR '|') value FROM product
UNION ALL
SELECT 'price' field, group_concat(DISTINCT price ORDER BY price SEPARATOR '|') value FROM product
UNION ALL
SELECT 'year' field, group_concat(DISTINCT year ORDER BY year SEPARATOR '|') value FROM product;

编辑: 如果您只想通过一个查询来实现这一点,您可以通过这种方式来实现

SELECT
    @uName := group_concat(DISTINCT name ORDER BY name SEPARATOR '|'),
    @uCat := group_concat(DISTINCT category ORDER BY category SEPARATOR '|') uCat,
    @uPrice := group_concat(DISTINCT price ORDER BY price SEPARATOR '|') uPrice,
    @uYear := group_concat(DISTINCT year ORDER BY year SEPARATOR '|') uYear
FROM product;

SELECT 'name' field, @uName value
UNION ALL
SELECT 'category' field, @uCat value
UNION ALL
SELECT 'price' field, @uPrice value
UNION ALL
SELECT 'year' field, @uYear value;

注意:您可以通过
组内的
进行
订购
类似的操作??使用union all以获得更好的形式,并防止出现任何重复

SELECT 'name' field, group_concat(DISTINCT name ORDER BY name SEPARATOR '|') value FROM product
UNION ALL
SELECT 'category' field, group_concat(DISTINCT category ORDER BY category SEPARATOR '|') value FROM product
UNION ALL
SELECT 'price' field, group_concat(DISTINCT price ORDER BY price SEPARATOR '|') value FROM product
UNION ALL
SELECT 'year' field, group_concat(DISTINCT year ORDER BY year SEPARATOR '|') value FROM product;

编辑: 如果您只想通过一个查询来实现这一点,您可以通过这种方式来实现

SELECT
    @uName := group_concat(DISTINCT name ORDER BY name SEPARATOR '|'),
    @uCat := group_concat(DISTINCT category ORDER BY category SEPARATOR '|') uCat,
    @uPrice := group_concat(DISTINCT price ORDER BY price SEPARATOR '|') uPrice,
    @uYear := group_concat(DISTINCT year ORDER BY year SEPARATOR '|') uYear
FROM product;

SELECT 'name' field, @uName value
UNION ALL
SELECT 'category' field, @uCat value
UNION ALL
SELECT 'price' field, @uPrice value
UNION ALL
SELECT 'year' field, @uYear value;

注意:您可以通过
组内的
进行
订购

有一种方法可以完成您的请求,而无需通过多次查询查询您的表。事实上,下面的方法是将任何表转换为枢轴的一种方法。它将使用mysql来准备SQL,然后执行:

SELECT 
  GROUP_CONCAT(f SEPARATOR ' UNION ALL ') 
FROM 
  (SELECT 
    CONCAT(
      'SELECT "', 
      column_name,
      '" AS `field`, GROUP_CONCAT(DISTINCT ', 
      column_name,
      ') AS `value` FROM `', 
      @table_name, 
      '`'
    ) AS f 
    FROM 
      ((SELECT 
          column_name 
        FROM 
          INFORMATION_SCHEMA.COLUMNS 
        WHERE 
          table_name=@table_name && 
          table_schema=@schema_name
        ) AS fields 
        CROSS JOIN 
        (SELECT 
          @table_name := 'product', 
          @schema_name:= 'test'
        ) AS init)
      ) AS sqldata
mysql> EXECUTE stmt;
+----------+--------------------------+
| field    | value                    |
+----------+--------------------------+
| ID       | 1,2,3,4,5,6,7,8          |
| name     | A,C,D,E,G                |
| category | Outdoor,Doll,Brainteaser |
| price    | 25,34,20,22,30           |
| year     | 2010,2009,2008           |
+----------+--------------------------+
5 rows in set (0.00 sec)
上面的sql将生成一个字符串,可用于分配变量,如

mysql> SET @sql:=(SELECT GROUP_CONCAT(f SEPARATOR ' UNION ALL ') FROM (SELECT CONCAT('SELECT "', column_name,'" AS `field`, GROUP_CONCAT(DISTINCT ', column_name,') AS `value` FROM `', @table_name, '`') AS f FROM ((SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=@table_name && table_schema=@schema_name) AS fields CROSS JOIN (SELECT @table_name:='product', @schema_name:='test') AS init)) AS sqldata);
Query OK, 0 rows affected (0.03 sec)
接下来,准备:

mysql> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
最后,执行它:

SELECT 
  GROUP_CONCAT(f SEPARATOR ' UNION ALL ') 
FROM 
  (SELECT 
    CONCAT(
      'SELECT "', 
      column_name,
      '" AS `field`, GROUP_CONCAT(DISTINCT ', 
      column_name,
      ') AS `value` FROM `', 
      @table_name, 
      '`'
    ) AS f 
    FROM 
      ((SELECT 
          column_name 
        FROM 
          INFORMATION_SCHEMA.COLUMNS 
        WHERE 
          table_name=@table_name && 
          table_schema=@schema_name
        ) AS fields 
        CROSS JOIN 
        (SELECT 
          @table_name := 'product', 
          @schema_name:= 'test'
        ) AS init)
      ) AS sqldata
mysql> EXECUTE stmt;
+----------+--------------------------+
| field    | value                    |
+----------+--------------------------+
| ID       | 1,2,3,4,5,6,7,8          |
| name     | A,C,D,E,G                |
| category | Outdoor,Doll,Brainteaser |
| price    | 25,34,20,22,30           |
| year     | 2010,2009,2008           |
+----------+--------------------------+
5 rows in set (0.00 sec)
这样做的好处是,您可以独立于表结构、字段名和tc。这是一种通用方法,因此您可以使用它为任何表创建这样的数据透视


关于变量
@table\u name
@schema\u name
的几句话。它们指定数据透视的表和模式。在上面的示例中,我使用了
交叉联接
将它们设置到位,但您可以单独设置它们,以维护不同的数据透视表。

有一种方法可以完成您的请求,而无需使用许多查询来查询表。事实上,下面的方法是将任何表转换为枢轴的一种方法。它将使用mysql来准备SQL,然后执行:

SELECT 
  GROUP_CONCAT(f SEPARATOR ' UNION ALL ') 
FROM 
  (SELECT 
    CONCAT(
      'SELECT "', 
      column_name,
      '" AS `field`, GROUP_CONCAT(DISTINCT ', 
      column_name,
      ') AS `value` FROM `', 
      @table_name, 
      '`'
    ) AS f 
    FROM 
      ((SELECT 
          column_name 
        FROM 
          INFORMATION_SCHEMA.COLUMNS 
        WHERE 
          table_name=@table_name && 
          table_schema=@schema_name
        ) AS fields 
        CROSS JOIN 
        (SELECT 
          @table_name := 'product', 
          @schema_name:= 'test'
        ) AS init)
      ) AS sqldata
mysql> EXECUTE stmt;
+----------+--------------------------+
| field    | value                    |
+----------+--------------------------+
| ID       | 1,2,3,4,5,6,7,8          |
| name     | A,C,D,E,G                |
| category | Outdoor,Doll,Brainteaser |
| price    | 25,34,20,22,30           |
| year     | 2010,2009,2008           |
+----------+--------------------------+
5 rows in set (0.00 sec)
上面的sql将生成一个字符串,可用于分配变量,如

mysql> SET @sql:=(SELECT GROUP_CONCAT(f SEPARATOR ' UNION ALL ') FROM (SELECT CONCAT('SELECT "', column_name,'" AS `field`, GROUP_CONCAT(DISTINCT ', column_name,') AS `value` FROM `', @table_name, '`') AS f FROM ((SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=@table_name && table_schema=@schema_name) AS fields CROSS JOIN (SELECT @table_name:='product', @schema_name:='test') AS init)) AS sqldata);
Query OK, 0 rows affected (0.03 sec)
接下来,准备:

mysql> PREPARE stmt FROM @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
最后,执行它:

SELECT 
  GROUP_CONCAT(f SEPARATOR ' UNION ALL ') 
FROM 
  (SELECT 
    CONCAT(
      'SELECT "', 
      column_name,
      '" AS `field`, GROUP_CONCAT(DISTINCT ', 
      column_name,
      ') AS `value` FROM `', 
      @table_name, 
      '`'
    ) AS f 
    FROM 
      ((SELECT 
          column_name 
        FROM 
          INFORMATION_SCHEMA.COLUMNS 
        WHERE 
          table_name=@table_name && 
          table_schema=@schema_name
        ) AS fields 
        CROSS JOIN 
        (SELECT 
          @table_name := 'product', 
          @schema_name:= 'test'
        ) AS init)
      ) AS sqldata
mysql> EXECUTE stmt;
+----------+--------------------------+
| field    | value                    |
+----------+--------------------------+
| ID       | 1,2,3,4,5,6,7,8          |
| name     | A,C,D,E,G                |
| category | Outdoor,Doll,Brainteaser |
| price    | 25,34,20,22,30           |
| year     | 2010,2009,2008           |
+----------+--------------------------+
5 rows in set (0.00 sec)
这样做的好处是,您可以独立于表结构、字段名和tc。这是一种通用方法,因此您可以使用它为任何表创建这样的数据透视


关于变量
@table\u name
@schema\u name
的几句话。它们指定数据透视的表和模式。在上面的示例中,我使用了
交叉联接
将它们设置到位,但您可以单独设置它们,以维护不同的数据透视表。

回答得不错,尽管感觉必须有一种方法可以只查询一次表。吹毛求疵:使用union all以获得更好的性能。在你得到它的时候,去掉尾随的Union,但是在你的组中,遗漏了他对分隔符“|”的请求,该分隔符跟在你的订单后面。@user3741598好吧,他在主题中谈论的是
,但是在预期的输出中遗漏了它,这就是让meGood困惑的答案,尽管感觉必须有一种方法才能查询表一次。吹毛求疵:使用union all以获得更好的性能。在你得到它的时候,去掉尾随的Union,但是在你的组中,他没有要求在你的订单后面加上分隔符“|”。@user3741598好吧,他在主题中说的是
,但是在预期输出中缺少了它,这让我很困惑,在什么情况下你在评估“值”的最大值,您正在调用哪个字段?在什么上下文中,您正在对调用字段的“值”计算最大值?@winkbrace如果您想在一个查询中看到一种方法,请参阅我的编辑:)@winkbrace如果您想在一个查询中看到一种方法,请参阅我的编辑:)