我可以在没有MySQL密钥的情况下透视表吗?

时间:2016-08-03 16:47:56

标签: mysql mysql-workbench

我有一个表格,其数据就像我的例子一样。我需要转动表,但没有键引用列名。如果Max和Min只有两个值,我可以这样做。但是,我最终会以20列结束。现在我将它们连接成一个表,然后将它们拆分成另一个表。我希望有一种更有效的方法。

 CREATE TABLE  test (
    ID VarChar(50), 
    PJQ VarChar(50));

    INSERT INTO test
      (ID, PJQ)
    VALUES 
      (1001, 'C982401'),
      (1001, 'F258147'),
      (1000, 'Q985267'),
      (1000, 'R258147'),
      (1000, 'T258476');

然后我可以做到这一点然而它只适用于两个。我将不得不这样做20次。

SELECT ID,
   MAX(PJQ) PJQ1,
   MIN(PJQ) PJQ2
FROM test
GROUP BY ID

我需要能够做到这一点。

ID      PJQ1     PJQ2      PJQ3
1000    T258476  Q985267   T258476
1001    F258147  C982401

对此问题的任何帮助都会非常有帮助。感谢

以下是Fiddle的链接,我一直试图解决这个问题。 Fiddle

1 个答案:

答案 0 :(得分:1)

您可以使用为每行增加变量的子查询,然后将其用作数据透视表键。

SELECT id, 
        MAX(IF(counter = 1, pjq, '')) AS pjq1,
        MAX(IF(counter = 2, pjq, '')) AS pjq2,
        MAX(IF(counter = 3, pjq, '')) AS pjq3,
        ...
        MAX(IF(counter = 20, pjq, '')) AS pjq20
FROM (SELECT id, pjq, 
            @counter := IF(id = @last_id, @counter + 1,
                            IF(@last_id := id, 1, 1)) AS counter
      FROM (SELECT id, pjq FROM test ORDER BY id, pjq) AS x
      CROSS JOIN (SELECT @counter := 0, @last_id = null) AS vars
) AS y
GROUP BY id

FIDDLE

只要您知道最大列数,此简单查询就会起作用。如果它可以是任意数字,那么您需要编写一个创建动态SQL的存储过程,首先获取每个ID的最大值,然后生成足够的MAX(IF...)列以获取所有这些。< / p>