我需要找到一种方法来创建一个 SQL 视图,允许我转置一些数据,这些数据在一个表中的特定列包含另一个表中的列名。
表:表单控件:
表单类型 | 字段名称 | 列名称 |
---|---|---|
STK | COL001 | 颜色 |
STK | SIZ001 | 尺寸1 |
STK | LIC001 | 许可证 |
表:表单数据:
股票代号 | 颜色 | 尺寸1 | 许可证 |
---|---|---|---|
12345 | R | 2 | XX |
ABCDE | L | 1 | AA |
AB123 | G | 3 | BB |
所需的视图结果数据:
表单类型 | 股票代号 | 字段名称 | 价值 |
---|---|---|---|
STK | 12345 | COL001 | R |
STK | 12345 | SIZ001 | 2 |
STK | 12345 | LIC001 | XX |
STK | ABCDE | COL001 | L |
STK | ABCDE | SIZ001 | 1 |
STK | ABCDE | LIC001 | AA |
STK | AB123 | COL001 | G |
STK | AB123 | SIZ001 | 3 |
STK | AB123 | LIC001 | BB |
字段名称/列可能会发生变化,所以理想情况下我需要视图是动态的,但如果不可能,那么现在只包含当前字段/列的固定视图就可以了。
请问有什么想法吗?
曾尝试使用 PIVOT,但对如何操作有点迷失。
交叉联接应该能够从 FormControl 和 FormData 表中获取所有组合,并使用 case 语句来选择每列的行。
这里是fiddle,它显示了预期的输出:
SELECT
fc.formtype,
fd.stockcode,
fc.fieldname,
CASE fc.column_name
WHEN 'Colour' THEN fd.colour
WHEN 'Size1' THEN fd.size1
WHEN 'License' THEN fd.license
ELSE NULL
END AS value
FROM
formcontrol fc
CROSS JOIN formdata fd
WHERE fc.formtype = 'STK'
order by fd.stockcode;