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

Откуда: Москва
Сообщений: 1131
SELECT MODEL_NAME, MODEL_CODE FROM 
(SELECT MODEL_NAME, MODEL_CODE, COLOR_CODE, QUANTITY
FROM REPORTS_SALES_MAINTABLE) as C
PIVOT (COUNT(QUANTITY) FOR COLOR_CODE IN ([26U], [Z7T])) AS PVT

Сообщение 170, уровень 15, состояние 1, строка 5
Line 5: Incorrect syntax near 'PIVOT'.


Замучался ужо. Ну что ему надо???
19 июн 09, 14:15    [7320758]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Может ошибка в версии вашего сервера ?
19 июн 09, 14:19    [7320782]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
Glory
Может ошибка в версии вашего сервера ?


да нет, 2005 стоит.
Хотя честно признаюсь, базу перенесли с двухтысячного...

Но на другой базе (которую тоже перенесли с двухтысячного) такие запросы отлично работают, а здесь ни разу не получилось. Может настройка есть какая?
19 июн 09, 14:22    [7320808]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
exec sp_dbcmptlevel '<Имя базы>'

должно быть не менее 90.
изменяется этой же процедурой.
19 июн 09, 14:25    [7320829]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gena928
Glory
Может ошибка в версии вашего сервера ?


да нет, 2005 стоит.
Хотя честно признаюсь, базу перенесли с двухтысячного...

А уровень совместимости у этой базы какой ?
19 июн 09, 14:25    [7320833]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
Glory
Gena928
Glory
Может ошибка в версии вашего сервера ?


да нет, 2005 стоит.
Хотя честно признаюсь, базу перенесли с двухтысячного...

А уровень совместимости у этой базы какой ?


SQL SERVER 2008 (80)

К сообщению приложен файл. Размер - 0Kb
19 июн 09, 14:32    [7320899]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Что-то вроде этого надо, да?
SELECT
 MODEL_NAME,
 MODEL_CODE,
 SUM(CASE COLOR_CODE WHEN '26U' THEN 1 ELSE 0 END)[26U],
 SUM(CASE COLOR_CODE WHEN 'Z7T' THEN 1 ELSE 0 END)[Z7T]
FROM REPORTS_SALES_MAINTABLE
GROUP BY MODEL_NAME,MODEL_CODE;
19 июн 09, 14:33    [7320909]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
daw
exec sp_dbcmptlevel '<Имя базы>'

должно быть не менее 90.
изменяется этой же процедурой.


проверил, у меня выдает 80.
Щас поменяю и попробую запрос еще раз.
19 июн 09, 14:34    [7320921]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gena928
Glory
Gena928
Glory
Может ошибка в версии вашего сервера ?


да нет, 2005 стоит.
Хотя честно признаюсь, базу перенесли с двухтысячного...

А уровень совместимости у этой базы какой ?


SQL SERVER 2008 (80)

Ну дык а почему 80 ?
19 июн 09, 14:35    [7320924]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Gena928
SQL SERVER 2008 (80)
Всё. PIVOT не получится.
А уровень совместимости поменять... Можно, конечно, но некоторые проблемы вылезут.
Вычищать их придётся. Типа (NOLOCK, INDEX=xx) без WITH, *=, ORDER BY NULL и т.п.
Лучше это на резервном сервере сначала отловить. IMHO
19 июн 09, 14:38    [7320961]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
iap
Gena928
SQL SERVER 2008 (80)
Всё. PIVOT не получится.
А уровень совместимости поменять... Можно, конечно, но некоторые проблемы вылезут.
Вычищать их придётся. Типа (NOLOCK, INDEX=xx) без WITH, *=, ORDER BY NULL и т.п.
Лучше это на резервном сервере сначала отловить. IMHO



да он и не меняется )))))
А не подскажете базу как нибудь конвертировать можно? Она не большая...

К сообщению приложен файл. Размер - 0Kb
19 июн 09, 14:44    [7321001]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
iap
Что-то вроде этого надо, да?
SELECT
 MODEL_NAME,
 MODEL_CODE,
 SUM(CASE COLOR_CODE WHEN '26U' THEN 1 ELSE 0 END)[26U],
 SUM(CASE COLOR_CODE WHEN 'Z7T' THEN 1 ELSE 0 END)[Z7T]
FROM REPORTS_SALES_MAINTABLE
GROUP BY MODEL_NAME,MODEL_CODE;


Спасибо за совет, работает. Только немножко не то. Мне нужны суммы QUANTITY в столбцах, а он выдает единички и нулики (есть нет). И потом я хотел приспособить PIVOT под динамическое изменение количества столбцов (в зависимости от того, какие там COLOR_CODE). Если есть еще идеи буду признателен.
19 июн 09, 14:45    [7321018]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Glory
Member

Откуда:
Сообщений: 104760
Gena928
iap
Gena928
SQL SERVER 2008 (80)
Всё. PIVOT не получится.
А уровень совместимости поменять... Можно, конечно, но некоторые проблемы вылезут.
Вычищать их придётся. Типа (NOLOCK, INDEX=xx) без WITH, *=, ORDER BY NULL и т.п.
Лучше это на резервном сервере сначала отловить. IMHO



да он и не меняется )))))
А не подскажете базу как нибудь конвертировать можно? Она не большая...

Сдается мне мил человек, что у вас только Студия от 2005. А сам сервер по-прежнему 2000
19 июн 09, 14:46    [7321025]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iljy
Guest
Gena928,

так замените 1 на QUANTITY и будет вам сумма! только тогда надо было в начальном запросе писать не count (QUANTITY), а sum(QUANTITY)
19 июн 09, 14:47    [7321034]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Gena928
И потом я хотел приспособить PIVOT под динамическое изменение количества столбцов (в зависимости от того, какие там COLOR_CODE).
Такого PIVOT у Microsoftа пока нет.
Количество колонок надо знать заранее!
Так что PIVOT ничем не лучше CASE.
И Ваши страдания по поводу 2000-го сервера в данном случае напрасны.
19 июн 09, 14:58    [7321136]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Gena928
Member

Откуда: Москва
Сообщений: 1131
iap
Gena928
И потом я хотел приспособить PIVOT под динамическое изменение количества столбцов (в зависимости от того, какие там COLOR_CODE).
Такого PIVOT у Microsoftа пока нет.
Количество колонок надо знать заранее!
Так что PIVOT ничем не лучше CASE.
И Ваши страдания по поводу 2000-го сервера в данном случае напрасны.


Хорошо хорошо удибили. Буду пробовать ))))
19 июн 09, 15:41    [7321438]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1141
iap
[quot Gena928]Количество колонок надо знать заранее!

Ничего подобного. Можно сделать динамикой и все будет работать отлично.
Если автора интересует динамика и pivot могу выложить примерчик, на днях сам столкнулся с такой задачкой.
19 июн 09, 15:49    [7321497]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
гостьххх
Guest
http://www.tsqltutorials.com/pivot.php


DECLARE @columns VARCHAR(8000)

SELECT @columns = COALESCE(@columns + ',[' + cast(Variable as varchar) + ']',
'[' + cast(Variable as varchar)+ ']')
FROM #temp123
GROUP BY Variable


DECLARE @query VARCHAR(8000)

SET @query = '
SELECT *
FROM #temp123
PIVOT
(
MAX(VaribleValue)
FOR [Variable]
IN (' + @columns + ')
)
AS p'

EXECUTE(@query)

Простите а это не динамическиое использование PIVOT?
19 июн 09, 15:53    [7321533]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iljy
Guest
гостьххх,

нет, это использование динамически формируемого запроса. и с CASE можно сделать то же самое
19 июн 09, 15:56    [7321556]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
Saller
Member

Откуда: exUSSR
Сообщений: 1141
iljy
гостьххх,

нет, это использование динамически формируемого запроса. и с CASE можно сделать то же самое

А если неизвестно какие будут колонки как ты будешь использовать кейз? Или каждый раз модифицировать запрос?
19 июн 09, 16:01    [7321608]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iljy
Guest
Saller
iljy
гостьххх,

нет, это использование динамически формируемого запроса. и с CASE можно сделать то же самое

А если неизвестно какие будут колонки как ты будешь использовать кейз? Или каждый раз модифицировать запрос?


declare @PNames as varchar(1024)
set @PNames = ''
select @PNames = @PNames + ',' +  [Название параметра] from dbo.Параметры
order by [ID Параметра]
set @PNames = substring(@PNames, 2, len(@PNames))

declare @Sql varchar(8000)
set @Sql = 
'SELECT COUNTER,' + @PNames +
' FROM' +
' (SELECT COUNTER, [Название параметра], [Значение]' +
' FROM '+
'	dbo.Значения t1 join dbo.Параметры t2 on t1.[ID Параметра] = t2.[ID Параметра]'+
' ) p'+
' PIVOT ('+
'	max([Значение])'+
'	FOR [Название параметра] IN	(' + @PNames + ')'+
' ) AS pvt order by COUNTER'

EXEC(@SQL)

это пример с PIVOT
set @PNames = ''
select @PNames = @PNames + ',' +
	'max(case when [Название параметра] = ''' + [Название параметра] +
    ''' then [Значение] else null end) as ''' + [Название параметра] + ''''
from dbo.[Параметры] order by [ID Параметра]
set @PNames = substring(@PNames, 2, len(@PNames))
select @PNames

declare @Sql varchar(8000)
set @Sql =
' SELECT [ID Испытания], COUNTER,' + @PNames +
' FROM' +
' (SELECT [ID Испытания], COUNTER, [Название параметра], [Значение]'+
' FROM' +
'	dbo.[Значения] t1 join dbo.[Параметры] t2 on t1.[ID Параметра] = t2.[ID Параметра]'+
' WHERE [ID Испытания] = 1' +
' ) p group by [ID Испытания], COUNTER'

EXEC(@Sql)
то же самое с CASE
19 июн 09, 16:18    [7321730]     Ответить | Цитировать Сообщить модератору
 Re: Проверьте PIVOT пожалуйста - не пойму где ошибка  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Saller
iljy
гостьххх,

нет, это использование динамически формируемого запроса. и с CASE можно сделать то же самое

А если неизвестно какие будут колонки как ты будешь использовать кейз? Или каждый раз модифицировать запрос?
Да всё точно так же, как и с PIVOT, если говорить про динамический запрос.
19 июн 09, 16:20    [7321749]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить