使用Unpivot转换SQL表
如果我有一个具有以下结构的表 ID名称A1 A2 A3 B1 B2 B3 X---Y---0---1---2---3---4---5(破折号只是用来推送标题下的值) 如何将其转换为以下内容: 身份证姓名字母1 2 3 X----Y----A----0-1-2 X---Y----B----3-4-5使用Unpivot转换SQL表,sql,database,unpivot,union-all,Sql,Database,Unpivot,Union All,如果我有一个具有以下结构的表 ID名称A1 A2 A3 B1 B2 B3 X---Y---0---1---2---3---4---5(破折号只是用来推送标题下的值) 如何将其转换为以下内容: 身份证姓名字母1 2 3 X----Y----A----0-1-2 X---Y----B----3-4-5 我不确定1,2,3是否可以用作列名;这可能取决于RDBMS
我不确定
1,2,3
是否可以用作列名;这可能取决于RDBMS虽然我不认为这是一个可行的答案,但它可能会给你一些考虑,因为它在SQL Server中产生了最终结果。
SELECT
upvt.id
, upvt.name
, left(label,1) AS letter
, CASE
WHEN left(label,1) = 'A' THEN MIN(value)
WHEN left(label,1) = 'B' THEN MAX(value)
END AS [1]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value1)
WHEN left(label,1) = 'B' THEN MAX(value1)
END AS [2]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value2)
WHEN left(label,1) = 'B' THEN MAX(value2)
END AS [3]
FROM example_table
UNPIVOT (
value
FOR label IN (a1,b1)
) upvt
INNER JOIN (
SELECT
id
, name
, left(label1,1) AS letter
, value1
FROM example_table
UNPIVOT (
value1
FOR label1 IN (a2,b2)
) upvt1 ) as b
ON upvt.id = b.id
AND upvt.name = b.name
INNER JOIN (
SELECT
id
, name
, left(label2,1) AS letter
, value2
FROM example_table
UNPIVOT (
value2
FOR label2 IN (a3,b3)
) upvt2 ) c
ON upvt.id = c.id
AND upvt.name = c.name
group by upvt.id, upvt.name, upvt.label
不完全是我所说的“生产就绪”。我不打算使用1 2 3,它们只是目前的示例名称。我会把我真正的列名放在这里:)没有办法更一般地做吗?从Sys cols或其他地方获取列名?我必须把每一个都硬编码成一份工会声明…?这对我来说似乎是个新问题。在这个问题上,我(或我的一般知识水平的回答者)需要知道您使用的是哪种RDBMS,并查看您希望将您的过程推广到的多个实例的示例。也可能是相关的,无论您是绑定到纯SQL还是可以为您的项目使用过程语言(PL/SQL、TSQL等)。
SELECT
upvt.id
, upvt.name
, left(label,1) AS letter
, CASE
WHEN left(label,1) = 'A' THEN MIN(value)
WHEN left(label,1) = 'B' THEN MAX(value)
END AS [1]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value1)
WHEN left(label,1) = 'B' THEN MAX(value1)
END AS [2]
, CASE
WHEN left(label,1) = 'A' THEN MIN(value2)
WHEN left(label,1) = 'B' THEN MAX(value2)
END AS [3]
FROM example_table
UNPIVOT (
value
FOR label IN (a1,b1)
) upvt
INNER JOIN (
SELECT
id
, name
, left(label1,1) AS letter
, value1
FROM example_table
UNPIVOT (
value1
FOR label1 IN (a2,b2)
) upvt1 ) as b
ON upvt.id = b.id
AND upvt.name = b.name
INNER JOIN (
SELECT
id
, name
, left(label2,1) AS letter
, value2
FROM example_table
UNPIVOT (
value2
FOR label2 IN (a3,b3)
) upvt2 ) c
ON upvt.id = c.id
AND upvt.name = c.name
group by upvt.id, upvt.name, upvt.label