Sql server 通过行到列转换联接表

Sql server 通过行到列转换联接表,sql-server,Sql Server,我有两张桌子: 输出需要如下所示: select CODE, NAME, substring_index(DVAR, ',', 1) as DATA1, (case when numc >= 2 then substring_index(substring_index(DVAR, ',', 2), ',', -1) end) as DATA2, (case when numc >= 3 then substring_index(substring_index(D

我有两张桌子:

输出需要如下所示:

select CODE, NAME,
   substring_index(DVAR, ',', 1) as DATA1,
   (case when numc >= 2 then substring_index(substring_index(DVAR, ',', 2), ',', -1) end) as DATA2,
   (case when numc >= 3 then substring_index(substring_index(DVAR, ',', 3), ',', -1) end) as DATA3,
   (case when numc >= 4 then substring_index(substring_index(DVAR, ',', 4), ',', -1) end) as DATA4,
   (case when numc >= 5 then substring_index(substring_index(DVAR, ',', 5), ',', -1) end) as DATA5,
   (case when numc >= 6 then substring_index(substring_index(DVAR, ',', 6), ',', -1) end) as DATA6,
   (case when numc >= 7 then substring_index(substring_index(DVAR, ',', 7), ',', -1) end) as DATA7,
   (case when numc >= 8 then substring_index(substring_index(DVAR, ',', 8), ',', -1) end) as DATA8,
   (case when numc >= 9 then substring_index(substring_index(DVAR, ',', 9), ',', -1) end) as DATA9,
   (case when numc >= 10 then substring_index(substring_index(DVAR, ',', 10), ',', -1) end) as DATA10
    FROM (
    SELECT T2.CODE, T1.NAME,  GROUP_CONCAT(T2.DATA SEPARATOR ',') AS DVAR, count(*) as numc
    FROM TABLE2 AS T2
    LEFT JOIN TABLE1 AS T1 ON T1.CODE=T2.CODE
    GROUP BY T2.CODE
         ) t

我在MySQL及其工作环境中使用了这段代码


但是我不知道在SQLServer2012中该怎么做。

您可以使用
PIVOT
获得类似的效果,例如

CREATE TABLE tbl1 (
    Code    CHAR(5) NOT NULL,
    [Name]  VARCHAR(20) NOT NULL
)


CREATE TABLE tbl2 (
    Code    CHAR(5) NOT NULL,
    [Data]  VARCHAR(20) NOT NULL
)


INSERT INTO tbl1 ( Code, [Name] )
VALUES
    ( 'ST101', 'Item1' ),
    ( 'ST102', 'Item2' ),
    ( 'ST103', 'Item3' ),
    ( 'ST104', 'Item4' ),
    ( 'ST105', 'Item5' )


INSERT INTO tbl2 ( Code, [Data] )
VALUES
    ( 'ST101',  '12345' ),
    ( 'ST101', '123456' ),
    ( 'ST101', '123123' ),
    ( 'ST101',  '12412' ),
    ( 'ST105', '123123' ),
    ( 'ST105',     '11' ),
    ( 'ST105',  '51231' ),
    ( 'ST105', '411123' ),
    ( 'ST103', '112312' ),
    ( 'ST103',  '51231' ),
    ( 'ST103', '442424' ),
    ( 'ST103',   '4233' ),
    ( 'ST103',  '23123' ),
    ( 'ST103',   '1231' ),
    ( 'ST104',  '12312' ),
    ( 'ST102',   '1231' ),
    ( 'ST102',  '51231' ),
    ( 'ST102',  '66452' ),
    ( 'ST102',  '51115' )
GO






;WITH cte AS (
SELECT 
    t1.Code, 
    t1.[Name], 
    t2.[Data], 
    'Data' + CAST( ROW_NUMBER() OVER( PARTITION BY t1.Code ORDER BY ( SELECT NULL ) ) AS VARCHAR(20) ) rn
FROM tbl1 t1
    INNER JOIN tbl2 t2 ON t1.Code = t2.Code
)
SELECT *
FROM cte
PIVOT ( MAX( Data ) For rn In ( Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10 ) ) pvt

如果数据项的数量大于10或未知,则应查看dynamic pivot。

您缺少任何聚合。没有任何聚合的
groupby
是毫无意义的(我认为MySQL存在严重缺陷,它允许隐含聚合/分组)。您可能需要
MAX
。请避免使用图像显示数据。请改为使用格式化文本,最好使用DDL+DML作为示例数据。@DaleK抱歉。我是新手,这很有效。非常感谢。事实上,我想我只需要5个。