powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT с дополнительными столбцами, не включёнными в GROUP BY
21 сообщений из 21, страница 1 из 1
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856397
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, прошу помочь в следующей проблеме. Хочу сделать обычный запрос c GROUP BY, сгруппировав записи по имени:

Код: plaintext
1.
SELECT A."ID", sum(A."Money") FROM "public"."AuthorMoney" A
GROUP BY A."ID";

Так всё проходит на ура. Но есть ещё таблица "Authors", связанная с AuthorMoney, в ней есть поля "Name", "LastName"... Хочу их вывести от сгруппированного ID, то есть так:

Код: plaintext
1.
2.
SELECT A."ID", N."Name", N."LastName", sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID";

То есть, чтобы группировка происходила по ID, а в конце просто дописывались остальные столбцы от этого айдишника, выбранные из другой таблицы, т.е. имя, фамилия и т.д. Ведь, айдишники уникальны, каждому принаджежит ОДНО имя.

Но база на это ругается: ERROR: column "N.Name" must appear in the GROUP BY clause or be used in an aggregate function.

Когда я включаю имя и фамилию из таблицы Authors в GROUP BY, ответ совершенно меняется и группировка происходит не так, как надо. Видимо, не по ID :(


Заранее спасибо за помощь, за ответ.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856646
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT A."ID", N."Name", N."LastName", sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID", N."Name", N."LastName";
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856796
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет ZemA, ты пишешь:
ZemA
Код: plaintext
1.
2.
SELECT A."ID", N."Name", N."LastName", sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID", N."Name", N."LastName";


Тебе незачет, ведь автор так делать пытался:
J-Pro Когда я включаю имя и фамилию из таблицы Authors в GROUP BY, ответ совершенно меняется и группировка происходит не так, как надо. Видимо, не по ID :(
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856800
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 автор топика:
Попробуй вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT V."ID", 
       N."Name", 
       N."LastName", 
       V.sum_money
  FROM (
          SELECT A."ID", 
                 sum(A."Money") as sum_money 
            FROM "public"."AuthorMoney" A
           GROUP BY A."ID"
       ) V
 INNER JOIN 
       "public"."Authors" N 
    ON V."ID" = N."ID"

Но у меня есть подозрение, что в таблице с авторами нарушена уникальность по ID.

Вот такой запрос чего возвращает:

Код: plaintext
1.
2.
3.
4.
select N."ID" , 
       count( 1 ) as cnt
  from "public"."Authors" N 
 group by N."ID"
having count( 1 ) >  1 

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856859
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор КоневПривет ZemA, ты пишешь:
ZemA
Код: plaintext
1.
2.
SELECT A."ID", N."Name", N."LastName", sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID", N."Name", N."LastName";


Тебе незачет, ведь автор так делать пытался:
J-Pro Когда я включаю имя и фамилию из таблицы Authors в GROUP BY, ответ совершенно меняется и группировка происходит не так, как надо. Видимо, не по ID :(
и после этого ты пишешь
Владимор Конев2 автор топика:
Попробуй вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT V."ID", 
       N."Name", 
       N."LastName", 
       V.sum_money
  FROM (
          SELECT A."ID", 
                 sum(A."Money") as sum_money 
            FROM "public"."AuthorMoney" A
           GROUP BY A."ID"
       ) V
 INNER JOIN 
       "public"."Authors" N 
    ON V."ID" = N."ID"

тоже самое что и у меня только через ж***
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856868
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemAТебе незачет, ведь автор так делать пытался:...
и после этого ты пишешь...
тоже самое что и у меня только через ж***

неправда. У него как раз все идеологически правильно. Сначала он выбирает нужные ID-шники, а затем связывает с ними значения из авторов.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33856893
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemAи после этого ты пишешь
.
.
.

тоже самое что и у меня только через ж***Видимо ты ещё ни раз в жизни не сталкивался с различными глюками сервера, возникающими при сортировке, группировке полей с русским текстом :)
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857073
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT A."ID",max(N."Name"),max(N."LastName"), sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID"
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857087
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemA
Код: plaintext
1.
2.
SELECT A."ID", N."Name", N."LastName", sum(A."Money") FROM "public"."AuthorMoney" A
JOIN "public"."Authors" N ON A."ID" = N."ID"
GROUP BY A."ID", N."Name", N."LastName";
Владимор Конев
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT V."ID", 
       N."Name", 
       N."LastName", 
       V.sum_money
  FROM (
          SELECT A."ID", 
                 sum(A."Money") as sum_money 
            FROM "public"."AuthorMoney" A
           GROUP BY A."ID"
       ) V
 INNER JOIN 
       "public"."Authors" N 
    ON V."ID" = N."ID"
Эти два запроса в случае уникальности поля ID в Authors выдадут одинаковый результат. В случае неуникальности результаты могут получиться разными, но наверное ID должно быть уникальным.

Кувалдин Роман ZemAтоже самое что и у меня только через ж***неправда. У него как раз все идеологически правильно. Сначала он выбирает нужные ID-шники, а затем связывает с ними значения из авторов.Может быть заметная разница в эффективности планов выполнения этих двух запросов, но имхо они оба "идеологически" правильные в предположении уникальности ID.

Владимор КоневВидимо ты ещё ни раз в жизни не сталкивался с различными глюками сервера, возникающими при сортировке, группировке полей с русским текстом :)Я тоже видимо к счастью :) с такими глюками не сталкивался. Но в любом случае кажется что глюки связанные с русским текстом надо решать на админском уровне, а не sql-запросов.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857121
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Эти два запроса в случае уникальности поля ID в Authors выдадут одинаковый результат. В случае неуникальности результаты могут получиться разными, но наверное ID должно быть уникальным.думаю, это неправильное утверждение. Хотя если уважаемый LeXa NalBat раскроет путь, приводящий к такому заключению, пожалуй попробую посмотреть на проблему более подробно.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857123
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев ZemAи после этого ты пишешь
.
.
.

тоже самое что и у меня только через ж***Видимо ты ещё ни раз в жизни не сталкивался с различными глюками сервера, возникающими при сортировке, группировке полей с русским текстом :)
Да ни разу т.к. у нас все сделано правильно и таких проблемм нет ;)
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857134
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemAДа ни разу т.к. у нас все сделано правильно и таких проблемм нет ;) Рад за вас от всей души!!! :)
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857148
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 LeXa NalBat Эти два запроса в случае уникальности поля ID в Authors выдадут одинаковый результат. В случае неуникальности результаты могут получиться разными, но наверное ID должно быть уникальным.думаю, это неправильное утверждение. Хотя если уважаемый LeXa NalBat раскроет путь, приводящий к такому заключению, пожалуй попробую посмотреть на проблему более подробно.Это произойдет, если в таблице Authors есть строки с одинаковыми ID, Name, LastName. Превый запрос их схлопнет увеличив значение sum, а в результатах второго запроса они будут повторяться.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33857520
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Превый запрос их схлопнет увеличив значение sum, а в результатах второго запроса они будут повторяться.понял. первый запрос возьмет сумму по ID, но с множителем "количество повторений" в (ID,Name,LastName). Второй выведет для каждой записи только однократную сумму по ID, но столько раз, сколько ID встретится в 1-й таблице.

т.е. вопрос не о повторении ID , но в повторении всего мн-ва параметров группировки ((ID,Name,LastName)).

Был не прав. Спасибо.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33878063
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, народ, за помощь. Простите, что долго не отвечал.

Я совсем запутался в этих GROUP BY. С одной стороны, если группировка идёт по ID, плюс ещё по связанным с ним, ТОЖЕ уникальным полем, то всё будет ок. Но если, к примеру, есть два юзера с ИД = 1 и ИД = 2, но зовут обоих Юра, то фиг знает, как будет проходить группировка....

И ещё: делаю теперь так: всё, что необходимо, включаю в подзапрос, а остальные данные выбираю уже из получившихся результатов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SELECT  

	AF."ActualFundingID",
	AF."Name", 
	AF."StartDate", 
	FS."FundSourceID",
	FS."Name", 
	AF."Quantity", 
	foo."psum", 
	(foo."psum"/AF."Quantity"* 100 )::numeric( 10 , 2 )

	FROM
(

 SELECT AF."ActualFundingID" AS "ID",
 	sum(PQ."Quantity") AS "psum"

 FROM "public"."ActualFundings" AF

  LEFT OUTER JOIN "public"."PlanQuantities" PQ ON PQ."ActualFundingID" = AF."ActualFundingID"
 GROUP BY AF."ActualFundingID"
 HAVING (sum(PQ."Quantity") IS NOT NULL)

) AS foo

JOIN "public"."ActualFundings" AF ON AF."ActualFundingID" = foo."ID"
JOIN "public"."FundSources" FS ON AF."FundSourceID" = FS."FundSourceID"

Таким образом, группировка происходит по AF."ActualFundingID", а потом просто добавляю к каждой записи необходимые данные. Но всё равно мне кажется, что чего-то я недопонял :)


А всем спасибо огромное за помощь!
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33880468
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Есть вот такая проблема:

Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT

    PQ."TaskID",
    T."Name", 
    PQ."CLINID", 
    C."Abbreviature", 
    sum(PQ."Quantity"), 
    sum(AQ."Quantity") 

FROM "public"."PlanQuantities" PQ
LEFT OUTER JOIN "public"."ActualQuantities" AQ ON PQ."TaskID" = AQ."TaskID" AND PQ."CLINID" = AQ."CLINID" AND PQ."VendorID" = AQ."VendorID" AND PQ."PerformDate" = AQ."ActualDate"
JOIN "public"."Tasks" T ON T."TaskID" = PQ."TaskID"
JOIN "public"."CLINs" C ON C."CLINID" = PQ."CLINID"
JOIN "public"."ContractPeriods" CP ON CP."ContractPeriodID" = PQ."ContractPeriodID"
GROUP BY PQ."CLINID", C."Abbreviature", PQ."TaskID", T."Name"

В таблице PQ есть поле "PerformDate". Хотелось бы выбрать только те, в которых дата находится в необходимом промежутке. Но, добавляя это поле в HAVING, база ругается, что оно должно быть либо в ф-ции суммирования, либо в GROUP BY. Но, добавляя его в GROUP BY, записей становится гораздо больше. Не знаю, как обойти проблему....


2. Есть ещё одна проблема. С тем же запросом. Причём, тут вложенный запрос не проканает. Вот, к примеру, имея запрос выше, я хочу получить тот же запрос, только группируя по PQ."CLINID" и всё, а потом добавить к тем записям их таскИД и всё остальное. Что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT

    PQ."CLINID", 
    sum(PQ."Quantity"), 
    sum(AQ."Quantity") 

FROM "public"."PlanQuantities" PQ
LEFT OUTER JOIN "public"."ActualQuantities" AQ ON PQ."TaskID" = AQ."TaskID" AND PQ."CLINID" = AQ."CLINID" AND PQ."VendorID" = AQ."VendorID" AND PQ."PerformDate" = AQ."ActualDate"
, а потом к каждой записи приписать, соответственно PQ."TaskID" и т.д. Но взять-то его я должен из таблицы "public"."PlanQuantities", зная уникальный ID этой таблицы. Но я его не вывожу, иначе пришлось бы группировать по нему, что привело бы к первоначальной таблице, правильно? Как быть, что посоветуете?


Спасибо всем огромное заранее!
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33880574
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-Pro добавляя это поле в HAVING, база ругается, что оно должно быть либо в ф-ции суммирования, либо в GROUP BY. Но, добавляя его в GROUP BY, записей становится гораздо больше. Не знаю, как обойти проблему....
Вы принципиально не используете WHERE в групповых запросах?
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33884565
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм... как я понял ещё давно из доков, HAVING и есть WHERE, только в случае использования GROUP BY. Т.е. WHERE использовать с GRUOP BY нельзя. Это неверно?


Насчёт второго пункта никто ничего не знает, народ?
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33884585
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-ProХм... как я понял ещё давно из доков, HAVING и есть WHERE, только в случае использования GROUP BY. Т.е. WHERE использовать с GRUOP BY нельзя. Это неверно?


Насчёт второго пункта никто ничего не знает, народ?Where - накладывается на результат выборки до группировки.
HAVING же накладывает условия на результат группировки.
Одно другому не мешает. В запросе может присутствовать как where, так и HAVING.
Другое дело, что без GROUP BY не может быть и HEAVING.
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33884616
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-ProНасчёт второго пункта никто ничего не знает, народ?Что за второй пункт?
...
Рейтинг: 0 / 0
SELECT с дополнительными столбцами, не включёнными в GROUP BY
    #33890159
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, поставил тему на подписку при ответе, а мыло не приходит, блин.
Извините за долгое отсутствие. Отвечаю:

Уважаемый Владимир Конев, спасибо за разъяснение. Начинал и до сих пор иногда обращаюсь, с книги Мартина Грубера, так там было написано, цитирую:
Martin GrouberПредположим, что в предыдущем примере, вы хотели бы увидеть только максимальную сумму приобретений значение которой выше $3000.00. Вы не сможете использовать агрегатную функцию в предложении WHERE ( если вы не используете подзапрос, описанный позже ), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. Это означает что вы не сможете сделать что-нибудь подобно следующему:
Код: plaintext
1.
2.
3.
SELECT snum, odate, MAX (amt)
FROM Oreders
WHERE MAX ((amt)) >  3000 . 00 
GROUP BY snum, odate;
Это будет отклонением от строгой интерпретации ANSI. Чтобы увидеть максимальную стоимость приобретений свыше $3000.00, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая:
Код: plaintext
1.
2.
3.
SELECT snum, odate, MAX ((amt))
FROM Orders
GROUP BY snum, odate
HAVING MAX ((amt)) >  3000 . 00 ;

Фразу Martin Grouber ... если вы не используете подзапрос, описанный позже ... заметил только сейчас, тогда особого внимания не предал...
В общем, спасибо за разъяснение! :)




Второй пункт вот:

J-Pro2. Есть ещё одна проблема. С тем же запросом. Причём, тут вложенный запрос не проканает. Вот, к примеру, имея запрос выше, я хочу получить тот же запрос, только группируя по PQ."CLINID" и всё, а потом добавить к тем записям их таскИД и всё остальное. Что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT

    PQ."CLINID", 
    sum(PQ."Quantity"), 
    sum(AQ."Quantity") 

FROM "public"."PlanQuantities" PQ
LEFT OUTER JOIN "public"."ActualQuantities" AQ ON PQ."TaskID" = AQ."TaskID" AND PQ."CLINID" = AQ."CLINID" AND PQ."VendorID" = AQ."VendorID" AND PQ."PerformDate" = AQ."ActualDate"
, а потом к каждой записи приписать, соответственно PQ."TaskID" и т.д. Но взять-то его я должен из таблицы "public"."PlanQuantities", зная уникальный ID этой таблицы. Но я его не вывожу, иначе пришлось бы группировать по нему, что привело бы к первоначальной таблице, правильно? Как быть, что посоветуете?
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT с дополнительными столбцами, не включёнными в GROUP BY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]