我正在使用Microsoft SQL Server。
输入
我有一张表Horizontal
和另一个表Vertical
所需输出显示为红色。
目标是将表格水平的每一行作为表格垂直的新列附加。
更具体一点:
Horizontal
的列'name'的每一行都将是表Vertical
的附加列的新列标题。Horizontal
的列'value'的每一行都将是表Vertical
的新追加列行。因此,我想知道如何在SQL中实现所需的结果(我使用Microsoft SQL Server)。
代码:
CREATE TABLE HORIZONTAL
(
id INT NOT NULL PRIMARY KEY,
NAME VARCHAR(40) NOT NULL,
VALUE INT NOT NULL
);
INSERT INTO HORIZONTAL (id, name, value)
VALUES (1, 'jersey', 22), (2, 'newYork', 33);
CREATE TABLE VERTICAL
(
id INT NOT NULL PRIMARY KEY,
PRODNAME VARCHAR(40) NOT NULL,
);
INSERT INTO VERTICAL (id, prodname)
VALUES (1, 'apple'), (2, 'orange'), (3, 'kiwi');
答案 0 :(得分:2)
首先需要使用交叉连接为每个产品名称生成每个属性名称,然后使用PIVOT
运算符:
SELECT id, prodname, [jersey], [newyork]
FROM
(
SELECT
v.id, name, value, v.prodname
FROM Horizontal as h
CROSS JOIN Vertical AS v
) AS t
PIVOT
(
MAX(value) for name IN([jersey], [newyork])
) AS p;
| id | prodname | jersey | newyork |
|----|----------|--------|---------|
| 1 | apple | 22 | 33 |
| 2 | orange | 22 | 33 |
| 3 | kiwi | 22 | 33 |
如果要对任何属性执行此操作而不是手动列出它们,则需要使用this demo中的动态sql动态执行此操作。
答案 1 :(得分:1)
您需要dynamic PIVOT
DECLARE @cols nvarchar(max) = STUFF(
(SELECT DISTINCT ',[' + h.name + ']' FROM HORIZONTAL h FOR XML PATH (''))
,1,1,'')
--PRINT @cols
DECLARE @query nvarchar(max) = N'SELECT id, prodname, ' + @cols + char(13) +
N' FROM
( select v.*, h.name, h.value
from VERTICAL v
CROSS JOIN dbo.HORIZONTAL h
) src
PIVOT
(
MIN(value) FOR name IN ('+ @cols +')
) pvt'
--PRINT @query
EXEC (@query)
在此处查看我的演示http://rextester.com/WGUU74996