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

Откуда:
Сообщений: 9
Собственно проблема в том, что не получается вот это:

Select EDCT, count(EDCT) as "count"
from PS_Table
Group by ECEDCT

EDCT count
DD 139808
LW 161651


Сделать как это:

[b]EDCT DD LW[/b]

Count 139808 161651

Может кто нибудь сталкивался с такой задачей?
24 июн 11, 10:05    [10866775]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Ошибочно написал. Вот так наверное:

Select EDCT, count(EDCT) as "count"
from PS_Table
Group by EDCT

выходной результат:
EDCT count
DD 139808
LW 161651


Сделать как это:
EDCT DD LW
Count 139808 161651

Может кто нибудь сталкивался с такой задачей?
24 июн 11, 10:08    [10866799]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Jickky,

pivot, если версия сервера позволяет
declare @t table (EDCT varchar(2), [count] int)
insert into @t select 'DD', 139808
insert into @t select 'LW', 161651
select
	[EDCT] = 'count',
	[DD],
	[LW]
from 
@t t
pivot (
	min([count]) for EDCT in ([DD],[LW])
) p
24 июн 11, 10:21    [10866892]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Не получается. Пробовал так, но тоже не выходит...

SELECT count(EDCT) as "count", [DD] as "DD", [LW] as "LW"
FROM 
(SELECT EDCT, count(EDCT)
		FROM PS_Table) AS SourceTable
PIVOT 
(
EDCT, count(EDCT) as "count"
		FOR EDCT in ([DD], [LW])
) AS PivotTable


есть еще варианты?
24 июн 11, 12:39    [10868316]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
кто нибудь сталкивался
Guest
кто нибудь сталкивался
24 июн 11, 12:58    [10868515]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Валдай
Member

Откуда:
Сообщений: 113
Jickky
Не получается. Пробовал так, но тоже не выходит...

Мдаа... Для начала не мешало бы почитать как работать с агрегатами.
Потом синтаксис и примеры из документации по pivot посмотреть

SELECT [EDCT] = 'count', [DD], [LW]
FROM (SELECT EDCT, [cou]=COUNT(*) FROM PS_Table GROUP BY EDCT) Src
PIVOT ( MIN([cou]) FOR EDCT in ([DD], [LW]) ) Pvt
24 июн 11, 14:29    [10869505]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Валдай,

у меня докуче оказалось compatibility level - SQL Server 2000 (80)
мне менять? или это может затронуть систему?
24 июн 11, 15:49    [10870410]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Валдай
Member

Откуда:
Сообщений: 113
Jickky
Валдай,

у меня докуче оказалось compatibility level - SQL Server 2000 (80)
мне менять? или это может затронуть систему?

Сервер >=2005, а база 2000? Так? Если это рабочий сервер, то точно лучше не менять:)

SELECT
  [EDCT] = 'count', 
  [DD] = SUM(CASE WHEN [EDCT] = 'DD' THEN [cou] ELSE 0 END), 
  [LW] = SUM(CASE WHEN [EDCT] = 'LW' THEN [cou] ELSE 0 END)
FROM
(
  SELECT EDCT, [cou]=COUNT(*) 
  FROM PS_Table 
  GROUP BY EDCT
)T
24 июн 11, 16:00    [10870550]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Валдай,

Да, сервер MS SQL 2005, а база 2000. И сервер продакшн.

При прогоне скрипта выходит:

Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

Погуглив я понял что это проблема решается так:

This Error means that your Database is still using the Old SQL 2000 Compatibility, So what you need to do is

1) Right Click on your Database and go to Properties
2) Select Options
3) In the Compatibility Level change it "SQL 2005 (90)"

and it will work.

Но как то страшновато менять настройки... тестовый сервер тоже не могу поменять, ибо между ними настроен мирроринг и база в закрытом состоянии... есть какие то светлые мысли?
24 июн 11, 16:43    [10871029]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Валдай,

А ну собственно сам скрипт вы указали, сорри, не заметил, попробую :)
24 июн 11, 16:45    [10871043]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
SELECT
  [EDCT] = 'count', 
  [DD] = SUM(CASE WHEN [EDCT] = 'DD' THEN [cou] ELSE 0 END), 
  [LW] = SUM(CASE WHEN [EDCT] = 'LW' THEN [cou] ELSE 0 END)
FROM
(
  SELECT EDCT, [cou]=COUNT(*) 
  FROM PS_Table 
  GROUP BY EDCT
)T

Вроде прогоняется норм, но только на выходе выдает неверные данные:

EDCT DD LW
count 1 1

Хотя count там явно свыше чем 1.
27 июн 11, 07:59    [10879370]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

Откуда:
Сообщений: 9
Все нормально работает. Спасибо! Я там перемудрил оказывается, создавая кучу временных таблиц.
Спасибо за помощь.
27 июн 11, 08:26    [10879391]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Jickky,

а почему не просто
SELECT
  [EDCT] = 'count', 
  [DD] = SUM(CASE WHEN [EDCT] = 'DD' THEN 1 ELSE 0 END), 
  [LW] = SUM(CASE WHEN [EDCT] = 'LW' THEN 1 ELSE 0 END)
FROM PS_Table;
???
27 июн 11, 09:35    [10879506]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Поточнее будет так:
SELECT
  [EDCT] = 'count', 
  [DD] = SUM(CASE WHEN [EDCT] = 'DD' THEN 1 ELSE 0 END), 
  [LW] = SUM(CASE WHEN [EDCT] = 'LW' THEN 1 ELSE 0 END)
FROM PS_Table
WHERE [EDCT] IN('DD','LW');
27 июн 11, 09:37    [10879508]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Jickky
Member

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

Да, вы правы, более простое решение, благодарю!
27 июн 11, 10:42    [10879761]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Ребят не могу найти близкую тему. Но вот как сделать наоборот, т.е из строки в столбец?

select
'111',
'222',
'333'

перевести в
Column1
111
222
333
13 сен 11, 12:21    [11268398]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
OracleLover, unpivot?
13 сен 11, 12:22    [11268408]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
OracleLover
Member

Откуда: Россия, Казань
Сообщений: 20899
Shakill
OracleLover, unpivot?


скажи плз как его использовать )) я не фига не допираю до его синтаксиса
13 сен 11, 12:24    [11268427]     Ответить | Цитировать Сообщить модератору
 Re: Перевод строку в столбец, и перечисление значений строк как столбцов. Не получается  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
OracleLover, нутк вот же простенький пример http://msdn.microsoft.com/ru-ru/library/ms177410.aspx , в самом конце про unpivot
13 сен 11, 12:33    [11268500]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить