如何将多行生成为 1 列值或在 MSsql 中用逗号分隔的 sql 语句
Posted
技术标签:
【中文标题】如何将多行生成为 1 列值或在 MSsql 中用逗号分隔的 sql 语句【英文标题】:how to produce multiple rows into 1 column value or sql statement with comma seperated in T-sql 【发布时间】:2011-09-26 02:00:55 【问题描述】:ColumnName IsOrdered Seq_ID
ABC 2 2
DEF 1 1
GHI 0 NULL
JKL 1 4
MNO 1 3
PQR 0 5
我在数据库中有一个表(table1),其中存储了上述值。
注意:-
我。 Is_Ordered 列:2 --> Desc; 1 --> 升序; 0 --> 默认。
二。 Seq_ID 列:列名'order by' 序列
这些值由用户存储在上表中。(即在用户界面上)。我想生成一个从多行到单个语句的“order by”子句,用逗号“,”分隔(单列)。
eg: select * from Table1 order by DEF asc, ABC desc, MNO asc, JKL asc
这里我想写一个sql语句来产生如上所示的order by语句i.e. (order by DEF asc, ABC desc, MNO asc, JKL asc)
在这里您会注意到 GHI 列和 PQR 列不包括在内,因为这两个列不是按用户界面中的选择顺序选择的。
我提前感谢您试图理解我的问题并为此提供适当的解决方案。
【问题讨论】:
【参考方案1】:给你(可能需要添加 CAST)
SELECT
'ORDER BY ' +
SUBSTRING(
(
SELECT
',' + ColumnName +
CASE IsOrdered
WHEN 1 THEN 'ASC'
WHEN 2 THEN 'DESC'
END
FROM
MyTable
WHERE
IsOrdered > 0 -- why have "IsIncluded" column ?
ORDER BY
Seq_ID
FOR XML PATH ('')
)
, 2, 7999)
【讨论】:
您好 gbn,感谢您非常迅速地提供解决方案。 IsIncluded 列我实际上在报告中使用条件来检查该值是否为 0,然后隐藏该列。这是我的错,我刚刚删除。谢谢。【参考方案2】:希望对你有帮助
DECLARE @OrderBySetting VARCHAR(max) = ''
DECLARE @OrderByString VARCHAR(max) = ''
DECLARE MY_CURSOR CURSOR
FOR SELECT ColumnName + ' ' +
case IsOrdered
WHEN 1 THEN 'ASC'
WHEN 2 THEN 'DESC'
END
+ ','
FROM Table1
WHERE (IsOrdered <> 0)
ORDER BY Seq_ID DESC
OPEN My_Cursor
Fetch NEXT FROM MY_Cursor INTO @OrderBySetting
WHILE @@FETCH_STATUS = 0
BEGIN
SET @OrderByString = @OrderBySetting + @OrderByString
FETCH NEXT FROM MY_Cursor INTO @OrderBySetting
END
CLOSE MY_Cursor
DEALLOCATE MY_Cursor
SET @OrderByString = 'SELECT * FROM TABLE1 ORDER BY ' + SUBSTRING(@OrderByString, 1, LEN(@OrderByString)-1)
【讨论】:
嗨 Raymund,+1 为我提供了非常快速的解决方案。谢谢!!!由于它是基于光标的,因此查看性能 --- 可能会有点慢。以上是关于如何将多行生成为 1 列值或在 MSsql 中用逗号分隔的 sql 语句的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pandas DataFrame 将列表等列值转换为多行