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 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失败!