如何将多行生成为 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 将列表等列值转换为多行

SQL求助,我要想在一张表新增多行,只有第一列值不同,后面的列值相同,该怎么插入?

MSSQL 将多行返回到数组中,每行分解为一个数组

如何在python中将列值转换为csv的多行[重复]

FlatMap 从列值到多行缺少架构