我有一个表格,其数据就像我的例子一样。我需要转动表,但没有键引用列名。如果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
答案 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
只要您知道最大列数,此简单查询就会起作用。如果它可以是任意数字,那么您需要编写一个创建动态SQL的存储过程,首先获取每个ID的最大值,然后生成足够的MAX(IF...)
列以获取所有这些。< / p>