【问题标题】:Displaying resultset rows as columns将结果集行显示为列
【发布时间】:2011-05-08 16:16:26
【问题描述】:

我有一个只返回一条记录的 SQL 存储过程。但是,在该过程中,是一个子查询,可以返回多于一行。我相信最好将子查询设计为返回一行多列,而不是多行。

我将如何写出子查询以便它返回列。
目前查询的是:

SET @Pkg_Status = (Select lf.name, edi.Date from EdiPackage edi, Labelfeed lf
     Where edi.orderID = @OrderID
     AND edi.code = lf.code
     AND lf.labelID = 'EDIStage')  

来自上述查询的示例结果集将是:

第 1 栏 第 2 栏 字段 1.值 1 字段 2.值 1 字段 1.值 2 字段 2.值 2 字段 1.值 3 字段 2.值 3

相反,我希望结果是:

第 1 栏 |第 2 列 |第 3 列 |第 4 栏 |第 5 栏 |第 6 栏 字段1.值1 |字段2.值1 |字段1.值2 |字段2.值2 |字段1.值3 |字段2.值3

如何做到这一点?

【问题讨论】:

  • 我不确定我们是否理解这个问题。您能向我们展示一些示例数据和所需的输出吗?
  • 查看 SQL Server 2000 中的旋转表。搜索 stackoverflow...我回答了类似的问题

标签: sql-server tsql sql-server-2000


【解决方案1】:

在 SQL 2005 及更高版本中,您将使用数据透视。

如果列数是固定的,请使用 Thomas 给出的答案。

否则,要将它们压缩到一个字段中,您可以执行类似的操作

Declare @Pkg_Status Character Varying(8000)
Select @Pkg_Status = 
  Coalesce(@Pkg_Status + ',' + LF.Name + ',' + Cast(EDI.Date As Character Varying),
           LF.Name + ',' + Cast(EDI.Date As Character Varying))
From
  dbo.EDIPackage As EDI
  Inner Join dbo.LabelFeed As LF
    On EDI.Code = LF.Code
Where
  (EDI.OrderID = @OrderID)
  And (LF.LabelID = 'EDIStage')

【讨论】:

  • 嗯,主存储过程将 XML 结果集返回给 Web 服务。因此需要返回一个记录。我的环境还在 SQL 2000 中。
  • 那么您最好将这些值合并到一个列中(使用适当的分隔符)。
  • 已添加。让我知道这是否有帮助。
【解决方案2】:

首先,您应该在连接两个表时使用 ISO Join 关键字,而不是通过逗号分隔表,然后在 Where 子句中“连接”它们。所以我们的查询是:

Select LF.name, EDI.Date 
From EdiPackage As EDI
    Join LabelFeed As LF
        On LF.Code = EDI.Code
Where EDI.orderID = @OrderID
    And LF.labelID = 'EDIStage'

其次,您最初的示例是将查询结果设置为变量。这不适用于多列或多行。充其量,SQL 可能只是取子查询中的第一列。最后,听起来你在寻找的是一个交叉表。我们需要查看数据,但您可以通过执行以下操作来实现您想要的:

Select Min( Case When LF.Name = 'Value1' Then LF.Name End ) As Col1
    , Min( Case When LF.Name = 'Value1' Then EDI.Date End ) As Col2
    , Min( Case When LF.Name = 'Value2' Then LF.Name End ) As Col3
    , Min( Case When LF.Name = 'Value2' Then EDI.Date End ) As Col4
    , Min( Case When LF.Name = 'Value3' Then LF.Name End ) As Col5
    , Min( Case When LF.Name = 'Value3' Then EDI.Date End ) As Col6
From EdiPackage As EDI
    Join LabelFeed As LF
        On LF.Code = EDI.Code
Where EDI.orderID = @OrderID
    And LF.labelID = 'EDIStage'

在这种情况下,您可以将“Value1”、“Value2”和“Value3”替换为用于区分一列和另一列的数据值。

【讨论】:

    【解决方案3】:

    您应该编写一个存储过程,该过程将创建一个新的内存表,您可以在其中动态添加列,并且每列将有不同的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2011-10-25
      • 2020-09-14
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      相关资源
      最近更新 更多