Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 переложить значения из одной колонки в 4  [new]
Alex S
Member

Откуда:
Сообщений: 293
Простейшая задача. Есть список значений 1,2,3,4,5,6 и т.д произвольного содержимого и количества.
Нужно вывести эту выборку в таблице из четырех колонок просто по порядку:
поле1 поле2 поле3 поле4
1 2 3 4
5 6 null null

нужно срочно по-простому написать, но по-простому как ?
8 май 14, 14:02    [15991361]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alex S
Есть список значений 1,2,3,4,5,6 и т.д произвольного содержимого и количества.

В воздухе висит "список значений" ? Или у вас в голове ?
8 май 14, 14:05    [15991392]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
Alex S
Member

Откуда:
Сообщений: 293
Glory,

В выборке. Cкажем в результатах такого запроса:
select SN from DEVICE where TYPE = 1 
8 май 14, 14:08    [15991414]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
Glory
Member

Откуда:
Сообщений: 104760
Нумеруете вашу выборку с разбиванием по группам. В группе нумерация идет лт 1 до 4
После этого делаете PIVOT
8 май 14, 14:11    [15991444]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
pegoopik_
Guest
Alex S,

DECLARE
  @STR VARCHAR(8000) = '1,2,43,43,1,12,2,34,2,1,2,2,3,4,4,1,2,1,2,2,34,4,3,1,1,2,34,2,3,1,2,2,3,4,34,342,2,1,2,2,1,213'

;WITH CTE AS(
  SELECT 0 N, SUBSTRING(@STR+',', 1, CHARINDEX(',', @STR)-1)X, STUFF(@STR, 1, CHARINDEX(',', @STR), '')+','S
  UNION ALL
  SELECT N+1, SUBSTRING(S+',', 1, CHARINDEX(',', S)-1)X, STUFF(S, 1, CHARINDEX(',', S), '')S
  FROM CTE
  WHERE CHARINDEX(',', S) > 0
)

SELECT 1+N/4[номер строки],
  MAX(CASE WHEN N%4=0 THEN X END)X1,
  MAX(CASE WHEN N%4=1 THEN X END)X2,
  MAX(CASE WHEN N%4=2 THEN X END)X3,
  MAX(CASE WHEN N%4=3 THEN X END)X4
FROM CTE
GROUP BY N/4

OPTION(MAXRECURSION 0)


номер строкиX1X2X3X4
1124343
2112234
32122
43441
52122
634431
712342
83122
93434342
102122
111213NULLNULL
8 май 14, 14:19    [15991507]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
pegoopik_
Guest
Alex S,

А.... Я почему-то думал проблема распарсить строку:)

Тогда так

DECLARE @T TABLE (Value INT)

INSERT @T VALUES(100)
INSERT @T VALUES(200)
INSERT @T VALUES(100)
INSERT @T VALUES(110)
INSERT @T VALUES(220)
INSERT @T VALUES(330)
INSERT @T VALUES(140)
INSERT @T VALUES(100)
INSERT @T VALUES(110)
INSERT @T VALUES(160)

SELECT [ROW], [1], [2], [3], [4]
FROM 
(
  SELECT Value, 
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)/4[ROW],
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)%4+1[COLUMN]
  FROM @T
) AS Src
PIVOT
(
  Max(Value)
  FOR [COLUMN] IN ([1], [2], [3], [4])
) AS P


или так:

DECLARE @T TABLE (Value INT)

INSERT @T VALUES(100)
INSERT @T VALUES(200)
INSERT @T VALUES(100)
INSERT @T VALUES(110)
INSERT @T VALUES(220)
INSERT @T VALUES(330)
INSERT @T VALUES(140)
INSERT @T VALUES(100)
INSERT @T VALUES(110)
INSERT @T VALUES(160)

SELECT [ROW], 
  MAX(CASE WHEN [COLUMN] = 1 THEN Value END)[1],
  MAX(CASE WHEN [COLUMN] = 2 THEN Value END)[2],
  MAX(CASE WHEN [COLUMN] = 3 THEN Value END)[3],
  MAX(CASE WHEN [COLUMN] = 4 THEN Value END)[4]
FROM 
(
  SELECT Value, 
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)/4[ROW],
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)%4+1[COLUMN]
  FROM @T
)T
GROUP BY [ROW]


ROW1234
0100200100110
1220330140100
2110160NULLNULL
8 май 14, 14:27    [15991576]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
pegoopik_
Guest
Alex S,

Или для вашей таблички так

DECLARE @DEVICE TABLE (Type INT, SN INT)

INSERT @DEVICE VALUES(1, 100)
INSERT @DEVICE VALUES(1, 230)
INSERT @DEVICE VALUES(1, 100)
INSERT @DEVICE VALUES(1, 140)
INSERT @DEVICE VALUES(1, 112)
INSERT @DEVICE VALUES(1, 120)
INSERT @DEVICE VALUES(2, 112)
INSERT @DEVICE VALUES(3, 230)
INSERT @DEVICE VALUES(4, 120)

select SN from @DEVICE where TYPE = 1 

SELECT [ROW], 
  MAX(CASE WHEN [COLUMN] = 1 THEN SN END)[SN_1],
  MAX(CASE WHEN [COLUMN] = 2 THEN SN END)[SN_2],
  MAX(CASE WHEN [COLUMN] = 3 THEN SN END)[SN_3],
  MAX(CASE WHEN [COLUMN] = 4 THEN SN END)[SN_4]
FROM 
(
  SELECT SN, 
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)/4[ROW],
    (ROW_NUMBER()OVER(ORDER BY (SELECT 1))-1)%4+1[COLUMN]
  FROM @DEVICE
  WHERE Type=1
)T
GROUP BY [ROW]
8 май 14, 14:33    [15991620]     Ответить | Цитировать Сообщить модератору
 Re: переложить значения из одной колонки в 4  [new]
Alex S
Member

Откуда:
Сообщений: 293
pegoopik_, Glory,

Спасибо! Получилось. Открыл для себя PIVOT. Раньше не пользовал - не знал.
8 май 14, 14:41    [15991700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить