sql server 2008 group_Concat() 版本但是在不同的列中(不是逗号分隔)

Posted

技术标签:

【中文标题】sql server 2008 group_Concat() 版本但是在不同的列中(不是逗号分隔)【英文标题】:sql server 2008 group_Concat() version BUT in different columns (NOT comma separated) 【发布时间】:2015-03-16 04:36:23 【问题描述】:

我正在开发 SQL Server 2008 R2。 我有以下 2 张桌子:

CREATE TABLE TRK_REQUEST(
REQUEST_ID int,
APPROVER_ID int CONSTRAINT app_ID_fk FOREIGN KEY REFERENCES TRK_APPROVER(APPROVER_ID),
APPROVER_LEVEL int)

CREATE TABLE TRK_APPROVER(APPROVER_ID int IDENTITY(1,1) PRIMARY KEY,
NAME Varchar(10))

INSERT INTO TRK_APPROVER VALUES('Approver_1'),('Approver_2'),('Approver_3')

INSERT INTO TRK_REQUEST VALUES(1, 1, 0),(1, 2, 1), (1, 3, 2)

我想要的是group_concat() 的版本,但值应该在单独的列中(不是逗号分隔)

我已经尝试加入表格,

SELECT REQ.REQUEST_ID, APP.NAME FROM TRK_REQUEST REQ
JOIN TRK_APPROVER APP
ON REQ.APPROVER_ID = APP.APPROVER_ID

但它给了我 3 个不同的行。

想要的输出是这样的,

| Request_ID  |    APPROVER_NAME1    |    APPROVER_NAME2    |    APPROVER_NAME3
+-------------+----------------------+----------------------+--------------------+
| 1           |    Approver_1        |    Approver_2        |    Approver_3

我在 SO 上找到了一些匹配的示例,但不是我所期望的。 请求您的帮助。

SQL Fiddle

【问题讨论】:

看来你需要PIVOT 有关解决方案的更多帮助请...喜欢一些试用代码? 【参考方案1】:

你可以使用dynamic crosstab:

DECLARE @sql1   VARCHAR(4000) = ''
DECLARE @sql2   VARCHAR(4000) = ''
DECLARE @sql3   VARCHAR(4000) = ''

SELECT @sql1 = 
'SELECT
    r.REQUEST_ID' + CHAR(10)

SELECT @sql2 = @sql2 +
'   , [' + a.NAME + '] = MAX(CASE WHEN a.APPROVER_ID = ' + CONVERT(VARCHAR(10), a.APPROVER_ID) + ' THEN a.NAME END)' + CHAR(10)
FROM (
    SELECT * FROM TRK_APPROVER
)a
ORDER BY a.APPROVER_ID

SELECT @sql3 = 
'FROM TRK_REQUEST r
INNER JOIN TRK_APPROVER a
    ON a.APPROVER_ID = r.APPROVER_ID
GROUP BY r.REQUEST_ID
ORDER BY r.REQUEST_ID
'

PRINT (@sql1 + @sql2 + @sql3)
EXEC (@sql1 + @sql2 + @sql3)

SQL FIDDLE

【讨论】:

这按预期工作。但是我可以请求一个简短的解释它是如何工作的吗? 查看PRINT (@sql1 + @sql2 + @sql3)的结果,你可以看到它是MAX(CASE WHEN..END)的形式,这就是你在交叉表中所做的。请参阅文章以供参考。

以上是关于sql server 2008 group_Concat() 版本但是在不同的列中(不是逗号分隔)的主要内容,如果未能解决你的问题,请参考以下文章

sql server2008升级到2008 R2出现问题

数据库SQL server 2008 R2和SQL server 2008 能一起安装吗?为啥安装完只剩SQL server 2008 R2一个了?

为啥安装的SQL SERVER 2008中SQL SERVER 服务只有1个

如何用SQL SERVER 2005连接SQL SERVER 2008

Sql server2008! SQL server服务无法启动,并显示错误17113, 修复Sql server2008失败!

SQL Server2008和SQL Server2008R2的区别,高手速进