2017-01-16 3 views
1

Мои данные набор:Как разбить несколько строк на один столбец?

|-------|------|---------|-------|-------|-------|-------| 
|OrderNo| Line |Customer | Desc |Unit |Price | Amount| 
|-------|------|---------|-------|-------|-------|-------| 
|S123456|10 | John | shirt | 1.00 | 19.99 | 0.00 | 
|-------|------|---------|-------|-------|-------|-------| 
|S123456|02 | John | pants | 0.00 | 40.00 | 40.00 | 
|-------|------|---------|-------|-------|-------|-------| 
|S123777|01 | Jane | misc | 0.00 | 0.00 | 10.00 | 
|-------|------|---------|-------|-------|-------|-------| 
|S123777|02 | Jane | pants | 0.00 | 40.00 | 40.00 | 

Результаты пытаются достичь:

|-------|---------|------|------|------|-------|--------|------|------|------|-------|--------| 
|OrderNo|Customer |Line1 |Desc1 |Unit1 |Price1 |Amount1 |Line2 |Desc 2|Unit2 |Price2 |Amount 2| 
|-------|---------|------|------|------|-------|--------|------|------|------|-------|--------| 
|S123456|John  |10 |shirt |1.00 |19.99 |0.00 |02 |pants |0.00 |40.00 |40.00 | 
|-------|---------|------|------|------|-------|--------|------|------|------|-------|--------| 
|S123777|Jane  |01 | misc |0.00 |0.00 |10.00 |02 |pants |0.00 |40.00 |40.00 | 
|-------|---------|------|------|------|-------|--------|------|------|------|-------|--------| 

О ДАННЫХ

Сервер: MSSQL Server 2012

Тип данных:

[OrderNo] NVARCHAR NOT NULL

, [Line] [INT] NOT NULL

[Клиент] NVARCHAR NOT NULL

[Desc] NVARCHAR NOT NULL

[Unit] [десятичный] (38, 20) NOT NULL

, [Цена] [десятичный] (38, 20) NOT NULL

, [Amount] [decimal] (38, 20) NOT NULL

Я хочу видеть одну строку за заказ без изменений. Пытается просмотреть все строки в порядке в строке.

К сожалению, номер строки не является надежным в его числе для данных, которые мне нужно вытащить (иногда строка 03 используется для комментария, а не для фактического элемента), поэтому я не понимаю, как получить вторую строку для разделить на желаемый набор результатов.

Любая помощь приветствуется!

+0

Попробуйте использовать соединение двух наборов результатов: GROUP BY MIN (линия); GROUP BY MAX (Line) :: JOIN ON OrderNo – Stavr00

+0

Итак, если в одном заказе есть 22 элемента, вам нужно 112 столбцов на выходе для всех строк, даже если все остальные заказы имеют только 2 элемента? Это может стать очень уродливым. –

+0

Наши линии обычно не превышают 5 строк. Чаще всего 2-3. – CoffeeCoder

ответ

0

Предполагая, что вам нужно идти динамично. Просто замените YourTable своим фактическим именем таблицы.

Declare @SQL varchar(max) = 
Stuff((Select ','+QuoteName(concat('Line' ,RN)) 
      +','+QuoteName(concat('Desc' ,RN)) 
      +','+QuoteName(concat('Unit' ,RN)) 
      +','+QuoteName(concat('Price' ,RN)) 
      +','+QuoteName(concat('Amount',RN)) 
     From (Select Distinct RN=Row_Number() over (Partition By OrderNo Order By Line) From YourTable) A 
     Order by 1 For XML Path('')),1,1,'') 

Select @SQL = ' 
Select [OrderNo],[Customer],' + @SQL + ' 
From (
     Select A.OrderNo 
       ,A.Customer 
       ,B.* 
     From (Select *,RN = cast(Row_Number() over (Partition By OrderNo Order By Line) as varchar(25)) From YourTable) A 
     Cross Apply (Values (''Line'' +A.RN,cast(A.[Line] as varchar(250))) 
          ,(''Desc'' +A.RN,cast(A.[Desc] as varchar(250))) 
          ,(''Unit'' +A.RN,Format(A.[Unit] ,''#,##0.00'')) 
          ,(''Price'' +A.RN,Format(A.[Price] ,''#,##0.00'')) 
          ,(''Amount''+A.RN,Format(A.[Amount],''#,##0.00'')) 
        ) B (Item,Value) 
    ) A 
Pivot (max([Value]) For [Item] in (' + @SQL + ')) p' 
Exec(@SQL); 

Возвращает

enter image description here


Если это помогает при визуализации, сгенерированный SQL выглядит следующим образом:

Select [OrderNo],[Customer],[Line1],[Desc1],[Unit1],[Price1],[Amount1],[Line2],[Desc2],[Unit2],[Price2],[Amount2] 
From (
     Select A.OrderNo 
       ,A.Customer 
       ,B.* 
     From (Select *,RN = cast(Row_Number() over (Partition By OrderNo Order By Line) as varchar(25)) From YourTable) A 
     Cross Apply (Values ('Line' +A.RN,cast(A.[Line] as varchar(250))) 
          ,('Desc' +A.RN,cast(A.[Desc] as varchar(250))) 
          ,('Unit' +A.RN,Format(A.[Unit] ,'#,##0.00')) 
          ,('Price' +A.RN,Format(A.[Price] ,'#,##0.00')) 
          ,('Amount'+A.RN,Format(A.[Amount],'#,##0.00')) 
        ) B (Item,Value) 
    ) A 
Pivot (max([Value]) For [Item] in ([Line1],[Desc1],[Unit1],[Price1],[Amount1],[Line2],[Desc2],[Unit2],[Price2],[Amount2])) p 

И подзапрос производит этот

enter image description here

+0

Я получаю сообщение об ошибке в подзапросе А «Ошибка преобразования при преобразовании значения nchar» в тип данных int. » это похоже на поле Desc. Не знаете, что делать?Я предполагаю, что Casting как varchar где-то, но в разделе «Значения» не работает для меня. Благодаря! Изменить пояснение: im проверить раздел «визуализация» – CoffeeCoder

+0

@CoffeeCoder, каков тип данных предоставленных данных выборки. –

+0

@CoffeeCoder Посмотреть обновление Я добавил случай в varchar в подзапросе для Line и Desc –