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

Откуда:
Сообщений: 266
Здравствуйте.

Используется MSSQL2008.

Код:


SELECT 
       ta_name,
       count(ta_name) AS count,
       ta_unit,
       ta_id_producer_goods
FROM   (SELECT ta.name AS ta_name,
               ta.unit  AS ta_unit,
               ta.id_producer_goods AS ta_id_producer_goods
            FROM   Table ta
            WHERE  id_city = '24'
               AND id_firm = '22131'
               AND id_service = '5') x
GROUP  BY ta_name 


При выполнении получаем ошибку:

Msg 8120, Level 16, State 1, Line 1
Column 'x.ta_unit' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


Подскажите как правильно выполнить код.

P.S.: понимаем, что ошибка в выборке при использовании Group, но все же как правильно выполнить скрипт?
25 сен 13, 22:03    [14884785]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
londinium
Member

Откуда: Киев
Сообщений: 1195
SELECT 
       ta_name,
       count(ta_name) AS countt,
       ta_unit,
       ta_id_producer_goods
FROM   (SELECT ta.name AS ta_name,
               ta.unit  AS ta_unit,
               ta.id_producer_goods AS ta_id_producer_goods
            FROM   Table ta
            WHERE  id_city = '24'
               AND id_firm = '22131'
               AND id_service = '5') x
GROUP  BY ta_name, ta_unit,ta_id_producer_goods

так?
25 сен 13, 22:12    [14884828]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Amateur7
Member

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

к сожалению нет, нам нужно сделать группировку только на уникальные name, а в Вашем примере идет группирвоака по 3 параметрам вместо 1, что сулит повторением name
25 сен 13, 22:40    [14884894]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31824
Amateur7
к сожалению нет, нам нужно сделать группировку только на уникальные name
Тогда вам нужно выбрать для неуникальных полей те значения, которые хотите показывать.
Например
SELECT
       ta_name,
       count(ta_name) AS countt,
       MAX(ta_unit),
       MAX(ta_id_producer_goods)
FROM   (SELECT ta.name AS ta_name,
               ta.unit  AS ta_unit,
               ta.id_producer_goods AS ta_id_producer_goods
            FROM   Table ta
            WHERE  id_city = '24'
               AND id_firm = '22131'
               AND id_service = '5') x
GROUP  BY ta_name


Или опишите, какой результат нужен, а то так очень долго угадывать, итерациями :-)
25 сен 13, 22:52    [14884947]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
alexeyvg
Или опишите, какой результат нужен, а то так очень долго угадывать, итерациями :-)


сорри, мне нужно получить строки с данными:
ta_name,
count(ta_name) AS count,
ta_unit,
ta_id_producer_goods

с уникальностью по ta_name ( т.е. строк с одинаковым ta_name быть не должно)
25 сен 13, 22:56    [14884962]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
londinium
Member

Откуда: Киев
Сообщений: 1195
автор
с уникальностью по ta_name ( т.е. строк с одинаковым ta_name быть не должно)

Не хотите показать скрипты таблиц, заполнение тестовыми данными и желаемый результат? А то будем долго гадать
25 сен 13, 22:59    [14884980]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31824
Amateur7
с уникальностью по ta_name ( т.е. строк с одинаковым ta_name быть не должно)
То есть из нескольких строк с одинаковым ta_name нужно вывести одну, любую?

Можно так:
SELECT
       ta_name,
       countt,
       ta_unit,
       ta_id_producer_goods
FROM (
	SELECT	ta.name AS ta_name,
		ta.unit  AS ta_unit,
		ta.id_producer_goods AS ta_id_producer_goods,
		count(*) over(partition by ta.name) as countt,
		ROW_NUMBER() over(partition by ta.name order by getdate()) as r
	FROM  Table ta
	WHERE  id_city = '24'
	   AND id_firm = '22131'
	   AND id_service = '5'
) x
WHERE r=1
25 сен 13, 23:34    [14885105]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
alexeyvg
Amateur7
с уникальностью по ta_name ( т.е. строк с одинаковым ta_name быть не должно)
То есть из нескольких строк с одинаковым ta_name нужно вывести одну, любую?

Можно так:
SELECT
       ta_name,
       countt,
       ta_unit,
       ta_id_producer_goods
FROM (
	SELECT	ta.name AS ta_name,
		ta.unit  AS ta_unit,
		ta.id_producer_goods AS ta_id_producer_goods,
		count(*) over(partition by ta.name) as countt,
		ROW_NUMBER() over(partition by ta.name order by getdate()) as r
	FROM  Table ta
	WHERE  id_city = '24'
	   AND id_firm = '22131'
	   AND id_service = '5'
) x
WHERE r=1



Вроде бы работает только при выполнении в sql manager слетает кодировка на результатах:

срин:
Картинка с другого сайта.

Как это можно исправить?
26 сен 13, 00:01    [14885224]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31824
Amateur7
Вроде бы работает только при выполнении в sql manager слетает кодировка на результатах:
sql manager - это что, SSMS?

И смотрите настройки виндов - как интерпретируются однобайтные не-ASCII символы (типы полей ведь не nvarchar?).
26 сен 13, 08:59    [14885707]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
как раз таки типы полей nvarchar
29 сен 13, 03:22    [14898031]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1566
Amateur7
Вроде бы работает только при выполнении в sql manager слетает кодировка на результатах:

срин:
Картинка с другого сайта.
И Вы можете доказать, что дело именно в кодировке? Что это именно она и именно слетает? Обычно, при слете кодировки клиент получает одни знаки вопроса, которые в данном случае не наблюдаются.
Как это можно исправить?
Поставить правильный шрифт, например.
29 сен 13, 11:57    [14898179]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3663
Amateur7
alexeyvg
Или опишите, какой результат нужен, а то так очень долго угадывать, итерациями :-)


сорри, мне нужно получить строки с данными:
ta_name,
count(ta_name) AS count,
ta_unit,
ta_id_producer_goods

с уникальностью по ta_name ( т.е. строк с одинаковым ta_name быть не должно)

разберитесь сперва что вы хотите получить, и по чем сгруппировать, сейчас вы явно не знаете что у вас за данные, и что надо.
29 сен 13, 20:08    [14898885]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Amateur7
Member

Откуда:
Сообщений: 266
Amateur7
alexeyvg
пропущено...
То есть из нескольких строк с одинаковым ta_name нужно вывести одну, любую?

Можно так:
SELECT
       ta_name,
       countt,
       ta_unit,
       ta_id_producer_goods
FROM (
	SELECT	ta.name AS ta_name,
		ta.unit  AS ta_unit,
		ta.id_producer_goods AS ta_id_producer_goods,
		count(*) over(partition by ta.name) as countt,
		ROW_NUMBER() over(partition by ta.name order by getdate()) as r
	FROM  Table ta
	WHERE  id_city = '24'
	   AND id_firm = '22131'
	   AND id_service = '5'
) x
WHERE r=1



Вроде бы работает только при выполнении в sql manager слетает кодировка на результатах:

срин:
Картинка с другого сайта.

Как это можно исправить?



А в чем еще может быть дело?
1 окт 13, 15:55    [14907859]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Amateur7
А в чем еще может быть дело?

В томо, что именно такие данные и храняться в вашей таблице
2 окт 13, 09:21    [14910246]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
Amateur7
Подскажите как правильно выполнить код.


чтобы получить что?
2 окт 13, 09:39    [14910317]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно выполнить запрос?  [new]
Гость333
Member

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

Приведите скрипт CREATE TABLE для этой таблицы.
2 окт 13, 10:03    [14910441]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить