Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Проблемы Group By


Автор: fess 28.6.2006, 14:30
Имеется следующий запрос:
Код

Select
  Sum([Информация_с_промысла].[Результат]),
  [Район].[Название_района],
  [Выгрузка].[Комментарий],
  [Страна].[Название]
  <ещё куча полей>
From <не важно>
Where <тоже не принципиально>
Group by   
  [Район].[Название_района],
  [Выгрузка].[Комментарий],
  [Страна].[Название]
  <ещё куча полей>

Где тип поля [Выгрузка].[Комментарий] -  ntext, запрос выдаёт ошибку, что нельзя группировать по этому полю, если его убираю из группировки, то тоже ругается: is invalid in the select list becouse it is not contained in either an aggregate function or the grop by.
Вопрос: Как мне изменить запрос, чтобы можно было выбрать и сумму по полю [Информация_с_промысла].[Результат] и комментарий (ну и другие поля)? 
По полю с комментарием группировка, естественно, не нужна... 

Автор: skyboy 28.6.2006, 14:38
fess, смотри: группировка позволяет рассчитать среднее, минимальное, максимальное и прочие значения в пределах группы. Ты же хочешь сгруппировать, потом посчитать сумму, и выдать комментарий. Если у тебя в группе окажется 5 записей, то ты просуммируешь 5 значений, так? И выдашь эту одну сумму для группы. А как ты собираешь выдать 5 комментариев в одном поле? Как ты вообще себе это представляешь? Если сильно надо выдать комментарии  для всех записей внутри группы в одном значений, то, не знаю, как в MSSQL, а в MySQL есть функция GROUP_CONCAT. Может, и здесь такое же есть? 

Автор: fess 28.6.2006, 14:43
Там всё нормально в этом плане... так как эти поля находятся в разных таблицах... просто они(таблицы) связаны по первичному-вторичному ключам... Весь запрос - большой - я не выкладываю его.... 

Автор: skyboy 28.6.2006, 14:51
СУБД отбирает записи по условию WHERE. Полученные строки группируются и внутри каждой группы вычисляется сумма. Не видеть тебе и группировку и не-группировку в пределах одного запроса. Разве что в FROM-секции сделать вложенный SELECT, который вернёт значения сумм.  

Автор: bas 28.6.2006, 14:53
Цитата(fess @  28.6.2006,  14:30 Найти цитируемый пост)
[Выгрузка].[Комментарий] 

Убери из select'a это поле и группировку по нему не производи.
На значение Sum([Информация_с_промысла].[Результат]) это не влияет, кажеться. 

Автор: fess 28.6.2006, 14:56
Цитата(bas @  28.6.2006,  14:53 Найти цитируемый пост)
На значение Sum([Информация_с_промысла].[Результат]) это не влияет, кажеться.  


Естественно, не влияет... но мне надо, чтобы запрос возвращал и это поле...

Добавлено @ 14:59 
Цитата(skyboy @  28.6.2006,  14:51 Найти цитируемый пост)
СУБД отбирает записи по условию WHERE. Полученные строки группируются и внутри каждой группы вычисляется сумма. Не видеть тебе и группировку и не-группировку в пределах одного запроса. 

Не спорю, но, в результирующей талице (после всяких объединений и т.п.) поле "Комментарий",  будет ОДИНАКОВО для всех полей [Информация_с_промысла].[Результат], по которым и делается сумма

Цитата(skyboy @  28.6.2006,  14:51 Найти цитируемый пост)
Разве что в FROM-секции сделать вложенный SELECT, который вернёт значения сумм.   

Можно поподробнее?  

Автор: skyboy 28.6.2006, 15:07
Цитата(fess @  28.6.2006,  14:56 Найти цитируемый пост)
Можно поподробнее?  

без знания структуры твоих таблиц и условий отбора, подробнее - просто некуда smile
Ну, если есть, например,  2 таблиц. В одной table-  id и name, в другой table1 - id и value и надо просуммировать value для каждого id, то так
Код

SELECT t.id,t.name,summed_table.summa 
FROM table as t,
    (SELECT id,sum(value) as summa FROM table1 GROUP BY id) as summed_table 
WHERE t.id=summed_table.id

должно, как мне кажется, работать...   

Автор: Vit 28.6.2006, 15:20
Групировать по полям типов text, ntext, image нельзя 

Автор: fess 28.6.2006, 15:24
Ага... мысль понятна... но не получается применить....

Просто использую внешнее объединение... не могу понять, как это применить... весь запрос:
Код

select
  [Район].[Название_района],

  [Выгрузка].[С_Ш],
  [Выгрузка].[Вост_Долг],
  [Выгрузка].[Долгота],
  [Выгрузка].[Дата],
  [Выгрузка].[С_С_Предварительно],
  [Выгрузка].[С_С_Подал],
  [Выгрузка].[С_П_Предварительно],
  [Выгрузка].[С_П_Подал],
  [Выгрузка].[Коментармй],
  [Выгрузка].[Номер],
  [Выгрузка].[Номер_С_С_Пред],
  [Выгрузка].[Номер_С_П_Пред],
  [Выгрузка].[Номер_С_П_Под],

  [Суда].[Позывной],
  [Суда].[Бортовой_Номер],
  [Суда].[Название],

  [o].[Позывной],
  [o].[Бортовой_Номер],
  [o].[Название],

  [Место_Выгрузки].[Порт],

  [Страна].[Название],

  Sum([Информация_с_промысла].[Результат]),
  [Информация_с_промысла].[Краб_шт],

  [Рыба].[ВидРыбы]



from

 {В общем, нужно делать группировку по [Рыба].Id и по [Выгрузка].Id по другим - необязательно}
  [Выгрузка] LEFT OUTER JOIN [Район] ON  [Выгрузка].[Id_Район]=[Район].Id
  LEFT OUTER JOIN [Суда] ON [Суда].[Id]=[Выгрузка].[Id_Судно_Сдатчик]
  LEFT OUTER JOIN [Суда] as o ON o.[Id]=[Выгрузка].[Id_Судно_Приёмщик]
  LEFT OUTER JOIN [Место_Выгрузки] ON [Выгрузка].[Id_Место]=[Место_Выгрузки].Id
  LEFT OUTER JOIN [Страна] ON  [Место_Выгрузки].[Id_Страна]=[Страна].Id
  LEFT OUTER JOIN [Информация_с_промысла]  on  [Информация_с_промысла].[Id_Выгрузка]= [Выгрузка].Id
  LEFT OUTER JOIN [Коэффициенты]  on   [Информация_с_промысла].[Id_Коэффициенты]=[Коэффициенты].Id
  LEFT OUTER JOIN [Рыба]  on [Коэффициенты].Id_Рыба=[Рыба].Id
where

  [Выгрузка].[Id_Судно_Сдатчик]=438
 {тут условие просто для примера... подставляются/заменяются дополниетольные во время выполнения программы}

 group by [Выгрузка].[Дата],[Выгрузка].Id, [Район].[Название_района], [Выгрузка].[С_Ш],
          [Выгрузка].[Вост_Долг],  [Выгрузка].[Долгота] ,[Выгрузка].[С_С_Предварительно],
          [Выгрузка].[С_С_Подал],  [Выгрузка].[С_П_Предварительно] , [Выгрузка].[С_П_Подал],
          [Выгрузка].[Коментармй] {тут всё и стопариться....}

Order by   [Выгрузка].[Дата],[Выгрузка].Id



Если не трудно, то подскажи...  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)