在 SQL 服务器中使用列连接进行透视
Pivot with Column Concatenation in SQL Server
请看下面的代码片段:
DROP TABLE IF EXISTS PROJECT_DETAILS;
CREATE TABLE PROJECT_DETAILS
(
PROJECT_NAME NVARCHAR(20),
PROJECT_TYPE NVARCHAR(20),
TOTAL_HOURS INT
);
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','AU',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','SGP',50)
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','NZ',75)
INSERT INTO PROJECT_DETAILS VALUES('ProjectB','US',200)
INSERT INTO PROJECT_DETAILS VALUES('ProjectB','CAN',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectC','JP',120)
INSERT INTO PROJECT_DETAILS VALUES('ProjectD','IND',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectD','CH',80)
INSERT INTO PROJECT_DETAILS VALUES('ProjectE','RSA',90)
INSERT INTO PROJECT_DETAILS VALUES('ProjectE','KEN',30)
期望的输出
PROEJCT_NAME PROJECT_TYPE EXEC_TYPE TOTAL_HRS
ProjectA AU AU-SGP-NZ 100
ProjectA SGP AU-SGP-NZ 50
ProjectA NZ AU-SGP-NZ 75
ProjectB US US-CAN 200
ProjectB CAN US-CAN 100
ProjectC JP JP 120
ProjectD IND IND-CH 100
ProjectD CH IND-CH 80
ProjectE RSA RSA-KEN 90
ProjectE KEN RSA-KEN 30
正如您在上面看到的,我希望将每个不同项目名称的列名称连接起来(作为一个新列)。如果您需要任何其他详细信息,请告诉我。
只需将 STUFF
与 XML
一起使用即可在单行中显示数据(无需 PIVOT
):
SELECT P.PROJECT_NAME,
P.PROJECT_TYPE,
[EXEC_TYPE] = STUFF(
(
SELECT
'-'+PROJECT_TYPE
FROM PROJECT_DETAILS
WHERE PROJECT_NAME = P.PROJECT_NAME FOR XML PATH('')
), 1, 1, ''),
P.TOTAL_HOURS
FROM PROJECT_DETAILS P;
输出:
PROEJCT_NAME PROJECT_TYPE EXEC_TYPE TOTAL_HRS
ProjectA AU AU-SGP-NZ 100
ProjectA SGP AU-SGP-NZ 50
ProjectA NZ AU-SGP-NZ 75
ProjectB US US-CAN 200
ProjectB CAN US-CAN 100
ProjectC JP JP 120
ProjectD IND IND-CH 100
ProjectD CH IND-CH 80
ProjectE RSA RSA-KEN 90
ProjectE KEN RSA-KEN 30
请看下面的代码片段:
DROP TABLE IF EXISTS PROJECT_DETAILS;
CREATE TABLE PROJECT_DETAILS
(
PROJECT_NAME NVARCHAR(20),
PROJECT_TYPE NVARCHAR(20),
TOTAL_HOURS INT
);
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','AU',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','SGP',50)
INSERT INTO PROJECT_DETAILS VALUES('ProjectA','NZ',75)
INSERT INTO PROJECT_DETAILS VALUES('ProjectB','US',200)
INSERT INTO PROJECT_DETAILS VALUES('ProjectB','CAN',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectC','JP',120)
INSERT INTO PROJECT_DETAILS VALUES('ProjectD','IND',100)
INSERT INTO PROJECT_DETAILS VALUES('ProjectD','CH',80)
INSERT INTO PROJECT_DETAILS VALUES('ProjectE','RSA',90)
INSERT INTO PROJECT_DETAILS VALUES('ProjectE','KEN',30)
期望的输出
PROEJCT_NAME PROJECT_TYPE EXEC_TYPE TOTAL_HRS
ProjectA AU AU-SGP-NZ 100
ProjectA SGP AU-SGP-NZ 50
ProjectA NZ AU-SGP-NZ 75
ProjectB US US-CAN 200
ProjectB CAN US-CAN 100
ProjectC JP JP 120
ProjectD IND IND-CH 100
ProjectD CH IND-CH 80
ProjectE RSA RSA-KEN 90
ProjectE KEN RSA-KEN 30
正如您在上面看到的,我希望将每个不同项目名称的列名称连接起来(作为一个新列)。如果您需要任何其他详细信息,请告诉我。
只需将 STUFF
与 XML
一起使用即可在单行中显示数据(无需 PIVOT
):
SELECT P.PROJECT_NAME,
P.PROJECT_TYPE,
[EXEC_TYPE] = STUFF(
(
SELECT
'-'+PROJECT_TYPE
FROM PROJECT_DETAILS
WHERE PROJECT_NAME = P.PROJECT_NAME FOR XML PATH('')
), 1, 1, ''),
P.TOTAL_HOURS
FROM PROJECT_DETAILS P;
输出:
PROEJCT_NAME PROJECT_TYPE EXEC_TYPE TOTAL_HRS
ProjectA AU AU-SGP-NZ 100
ProjectA SGP AU-SGP-NZ 50
ProjectA NZ AU-SGP-NZ 75
ProjectB US US-CAN 200
ProjectB CAN US-CAN 100
ProjectC JP JP 120
ProjectD IND IND-CH 100
ProjectD CH IND-CH 80
ProjectE RSA RSA-KEN 90
ProjectE KEN RSA-KEN 30