Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT с дополнительными столбцами, не включёнными в GROUP BY / 21 сообщений из 21, страница 1 из 1
16.07.2006, 15:06
    #33856397
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Народ, прошу помочь в следующей проблеме. Хочу сделать обычный запрос 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
16.07.2006, 20:20
    #33856646
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Код: 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
17.07.2006, 05:40
    #33856796
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Привет 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
17.07.2006, 05:47
    #33856800
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
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
17.07.2006, 08:18
    #33856859
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Владимор КоневПривет 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
17.07.2006, 08:29
    #33856868
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
ZemAТебе незачет, ведь автор так делать пытался:...
и после этого ты пишешь...
тоже самое что и у меня только через ж***

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

тоже самое что и у меня только через ж***Видимо ты ещё ни раз в жизни не сталкивался с различными глюками сервера, возникающими при сортировке, группировке полей с русским текстом :)
...
Рейтинг: 0 / 0
17.07.2006, 10:10
    #33857073
domanix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
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
17.07.2006, 10:19
    #33857087
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
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
17.07.2006, 10:34
    #33857121
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
LeXa NalBat Эти два запроса в случае уникальности поля ID в Authors выдадут одинаковый результат. В случае неуникальности результаты могут получиться разными, но наверное ID должно быть уникальным.думаю, это неправильное утверждение. Хотя если уважаемый LeXa NalBat раскроет путь, приводящий к такому заключению, пожалуй попробую посмотреть на проблему более подробно.
...
Рейтинг: 0 / 0
17.07.2006, 10:35
    #33857123
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Владимор Конев ZemAи после этого ты пишешь
.
.
.

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

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

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

Я совсем запутался в этих 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
26.07.2006, 17:40
    #33880468
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
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
26.07.2006, 18:09
    #33880574
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
J-Pro добавляя это поле в HAVING, база ругается, что оно должно быть либо в ф-ции суммирования, либо в GROUP BY. Но, добавляя его в GROUP BY, записей становится гораздо больше. Не знаю, как обойти проблему....
Вы принципиально не используете WHERE в групповых запросах?
...
Рейтинг: 0 / 0
28.07.2006, 11:26
    #33884565
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SELECT с дополнительными столбцами, не включёнными в GROUP BY
Хм... как я понял ещё давно из доков, HAVING и есть WHERE, только в случае использования GROUP BY. Т.е. WHERE использовать с GRUOP BY нельзя. Это неверно?


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


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

Уважаемый Владимир Конев, спасибо за разъяснение. Начинал и до сих пор иногда обращаюсь, с книги Мартина Грубера, так там было написано, цитирую:
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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT с дополнительными столбцами, не включёнными в GROUP BY / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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