简体   繁体   English

动态行成列

[英]Dynamic rows into columns

Hi I need to be able to join two tables and return the second table as columns to the first table. 嗨,我需要能够联接两个表并将第二个表作为列返回第一个表。 I need to create (dependent first name, dependent last name, and dependent relationship) based on the max number depid (which can be dynamic). 我需要基于最大数量depid(可以是动态的)创建(相关的名字,相关的姓氏和相关的关系)。

thank you in advance 先感谢您

table 1 表格1

+-------------+-------------+------------+
| employeeid  | first name  | last name  |
+-------------+-------------+------------+
|           1 | bill        | johnson    |
|           2 | matt        | smith      |
|           3 | katy        | lewis      |
+-------------+-------------+------------+

table 2 表2

+-------------------------------------------------------------------+
| employeeid |dependent id  | First Name | Last Name | Relationship |
+-------------------------------------------------------------------+
| 1               1            mary          johnson    spouse      |
| 1               2            aaron         johnson     child      |
| 2               1            eric          smith       child      |
+-------------------------------------------------------------------+

expected output 预期产量

+------------+------------+-----------+----------------------+---------------------+------------------------+----------------------+---------------------+------------------------+
| employeeid | first name | last name | dependent first name | dependent last name | dependent relationship | dependent first name | dependent last name | dependent relationship |
+------------+------------+-----------+----------------------+---------------------+------------------------+----------------------+---------------------+------------------------+
|          1 | bill       | johnson   | mary                 | johnson             | spouse                 | aaron                | johnson             | child                  |
|          2 | matt       | smith     | eric                 | smith               | child                  |                      |                     |                        |
|          3 | katty      | lewis     |                      |                     |                        |                      |                     |                        |
+------------+------------+-----------+----------------------+---------------------+------------------------+----------------------+---------------------+------------------------+             

You Can do This with dynamic SQL & XML Path example SQL below 您可以使用下面的动态SQL和XML路径示例SQL来执行此操作

--Table 1 - 表格1

CREATE TABLE #TMP1 (EMP_ID INT, NAME Char(10) ) INSERT INTO #TMP1 VALUES (1,'One') INSERT INTO #TMP1 VALUES (2,'TWO') INSERT INTO #TMP1 VALUES (3,'Three') 创建表#TMP1(EMP_ID INT,名称Char(10))插入#TMP1值(1,'One')插入#TMP1值(2,'TWO')插入#TMP1值(3,'Three')

--Table 2 -表2

CREATE TABLE #TMP2 (EMP_ID INT, DP_ID INT,FNAME Char(10),Rel Char(10) ) INSERT INTO #TMP2 VALUES (1,1,'Spouse One','Spouse') INSERT INTO #TMP2 VALUES (1,2,'Child One','Child') INSERT INTO #TMP2 VALUES (2,1,'Child TWO','Child') 创建表#TMP2(EMP_ID INT,DP_ID INT,FNAME Char(10),Rel Char(10))插入#TMP2值(1,1,'Spouse One','Spouse')插入#TMP2值(1, 2,'Child One','Child')插入#TMP2值(2,1,'Child TWO','Child')

Declare @CNT Int , @Ctr int = 0 , @SQL VarChar(MAX) 声明@CNT Int,@Ctr int = 0,@SQL VarChar(MAX)

--Get Max Dependent ID -获取最大相关ID

SELECT @CNT = MAX(DP_ID) from #TMP2 从#TMP2选择SELECT @CNT = MAX(DP_ID)

--For Verification SELECT @CNT -用于验证 SELECT @CNT

--Build Dynamic SQL to get the dataset -构建动态SQL以获取数据集

SET @SQL = 'SELECT Emp_ID ' SET @SQL ='选择Emp_ID'

While @Ctr < @CNT 而@Ctr <@CNT

Begin 开始

Set @Ctr = @Ctr+1
SET @SQL = @SQL + ', ( SELECT FName+'+''''+''''+'  FROM #TMP2 Where #TMP1.EMP_ID = #TMP2.EMP_ID and #TMP2.DP_ID = '+Convert(VarChar(2),@Ctr)+' For XML Path ('+''''+''''+') ) as FName'+Convert(VarChar(2),@Ctr)
SET @SQL = @SQL + ',  ( SELECT Rel+'+''''+''''+'   FROM #TMP2 Where #TMP1.EMP_ID = #TMP2.EMP_ID and #TMP2.DP_ID = '+Convert(VarChar(2),@Ctr)+' FOR XML Path ('+''''+''''+') )  as Rel'+Convert(VarChar(2),@Ctr)

End 结束

SET @SQL = @SQL+' FROM #TMP1 ' SET @SQL = @ SQL +'FROM#TMP1'

--For Verification Print the Dynamic SQL -用于验证打印动态SQL

Select @SQL 选择@SQL

--Execute the dynamic SQL -执行动态SQL

EXEC(@SQL) 执行(@SQL)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM