Отображение строк набора результатов в виде столбцов - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть хранимая процедура 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')  

Пример набора результатов из вышеупомянутого запроса будет:

Column 1             Column 2  
Field1.Value1     Field2.Value1  
Field1.Value2     Field2.Value2  
Field1.Value3     Field2.Value3  

Вместо этого я хотел бы, чтобы результаты были:

Column 1      | Column2       | Column3       | Column4      |  Column 5       | Column 6  
Field1.Value1 | Field2.Value1 | Field1.Value2 | Field2.Value2 | Field1.Value3 | Field2.Value3

Как это можно сделать?

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Во-первых, вы должны использовать ключевое слово 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'

В этом случае вы должны заменить «Значение1», «Значение2» и «Значение3» значениями данных, которые следует использовать для различения одного столбца от другого.

0 голосов
/ 11 ноября 2010

В SQL 2005 и выше вы должны использовать pivot.

Если число столбцов фиксировано, используйте ответ, который дал Томас.

Иначе, чтобы сложить их в одно поле, вы должны сделать что-то вроде

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')
0 голосов
/ 11 ноября 2010

Вы должны написать хранимую процедуру, которая создаст новую таблицу памяти, в которую вы можете динамически добавлять столбцы, и каждый столбец будет иметь свою строку.

...