SQL从表A的行中插入表B中的新列

问题描述 投票:0回答:2

我正在使用Microsoft SQL Server。

输入

我有一张桌子Horizontal

enter image description here

和另一张桌子Vertical

enter image description here

所需输出显示为红色。

目标是将表格水平的每一行作为表格垂直的新列附加。

更具体:

  • Horizontal的列'name'的每一行都将是表Vertical的附加列的新列标题。
  • Horizontal的列'value'的每一行将是表Vertical的新追加列行。

enter image description here

因此,我想知道如何在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');
sql sql-server rows
2个回答
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


2
投票

首先需要使用交叉连接为每个prod名称生成每个属性名称,然后使用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;

Demo

| id | prodname | jersey | newyork |
|----|----------|--------|---------|
|  1 |    apple |     22 |      33 |
|  2 |   orange |     22 |      33 |
|  3 |     kiwi |     22 |      33 |

如果要对任何属性执行此操作而不是手动列出它们,则需要使用this demo中的动态sql动态执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.