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个。