powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Про макс.значение поля
20 сообщений из 20, страница 1 из 1
Про макс.значение поля
    #39445261
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Прошу сильно не пинаться за возможно мелкий вопрос. Просто туплю и не могу вспомнить.

Есть проблемка в работе след. кода
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT ORD.ID_CODE, 
       MAX(DOC.D_NUMBER),
       CCT.VD_NAME,
       USR.U_NAME,
       ORD.D_DELSTAT,
       ORD.D_NUMBER, ORD.D_DATE,
       COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0),
       ORD.D_DESC

FROM D_ORDER ORD

LEFT JOIN VD_ITEMSORDER IORD ON IORD.ID_ORDER = ORD.ID_CODE
LEFT JOIN VD_CUSTCONTACT CCT ON CCT.ID_CODE   = ORD.ID_CUSTOMER
LEFT JOIN D_USER USR ON USR.ID_CODE   = ORD.ID_CALLUSER
LEFT JOIN D_DOCUMENT DOC ON DOC.ID_ORDER = ORD.ID_CODE

GROUP BY
    ORD.ID_CODE,
    DOC.D_NUMBER,
    CCT.VD_NAME,
    USR.U_NAME,
    ORD.D_DELSTAT,
    ORD.D_NUMBER, ORD.D_DATE,
    ORD.D_DESC



Значение COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) суммируется столько раз, сколько записей в D_DOCUMENT
Помогите исправить. Плиз :)
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445298
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranЕсть проблемка в работе след. кода
...
Значение COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) суммируется столько раз, сколько записей в D_DOCUMENT
Помогите исправить.Код работает правильно. Можете не благодарить.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445343
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот именно. Несколько раз. А надо тока один :(
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445364
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranЗначение COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) суммируется столько раз, сколько записей в D_DOCUMENT
Код: sql
1.
2.
3.
GROUP BY
    ORD.ID_CODE,
    DOC.D_NUMBER,


если у вас DOC.D_NUMBER уникален для каждой записи в D_DOCUMENT. то количество групп будет равно количеству записей
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445365
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только сейчас заметил:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT ORD.ID_CODE, 
       MAX(DOC.D_NUMBER),
       CCT.VD_NAME,
       USR.U_NAME,
       ORD.D_DELSTAT,
       ORD.D_NUMBER, ORD.D_DATE,
       COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0),
       ORD.D_DESC

FROM D_ORDER ORD

LEFT JOIN VD_ITEMSORDER IORD ON IORD.ID_ORDER = ORD.ID_CODE
LEFT JOIN VD_CUSTCONTACT CCT ON CCT.ID_CODE   = ORD.ID_CUSTOMER
LEFT JOIN D_USER USR ON USR.ID_CODE   = ORD.ID_CALLUSER
LEFT JOIN D_DOCUMENT DOC ON DOC.ID_ORDER = ORD.ID_CODE

GROUP BY
    ORD.ID_CODE,
    DOC.D_NUMBER,
    CCT.VD_NAME,
    USR.U_NAME,
    ORD.D_DELSTAT,
    ORD.D_NUMBER, ORD.D_DATE,
    ORD.D_DESC

Запихивание одного поля в груп бай и в агрегатную функцию редко бывает осмысленным действием.
Уточните заодно, что именно вы ждете в результате и сделайте тестовые данные. А что за СУБД, кстати?
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445390
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DOC.D_NUMBER не уникален для каждой записи в D_DOCUMENT и может повторяться несколько раз, поэтому тех записях, где DOC.D_NUMBER имеет одно или несколько, но разных значений, результаты запроса удовлетворяют. Но если DOC.D_NUMBER имеет несколько одинаковых значений и они все максимальные, то COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) работает столько раз, сколько есть этих одинаковых максимальных значений.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445391
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никанор КузьмичТолько сейчас заметил:[src]
А что за СУБД, кстати?

Firebird 2.5
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445624
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема актуальна
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445628
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте подзапросы
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39445796
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranDOC.D_NUMBER не уникален для каждой записи в D_DOCUMENT и может повторяться несколько раз, поэтому тех записях, где DOC.D_NUMBER имеет одно или несколько, но разных значений, результаты запроса удовлетворяют. Но если DOC.D_NUMBER имеет несколько одинаковых значений и они все максимальные, то COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) работает столько раз, сколько есть этих одинаковых максимальных значений.Кто вас только русскому языку учил! Я раз пять перечитал, но так ничего и не понял. Вот это: "COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) работает столько раз, сколько есть этих одинаковых максимальных значений" - что значит? "Работает столько раз" = "выдает столько строк"? Или как вы считаете эти "разы"?
Вот для начала: у вас в секции GROUB BY перечислены 8 разных полей. Вы в курсе, что если у вас одному и тому же значению DOC.D_NUMBER соответствуют, например, 3 разных значения ORD.ID_CODE, то у вас будет в результате 3 строки с одинаковым DOC.D_NUMBER? А в курсе, как сделать так, чтобы осталось по одной строке на один DOC.D_NUMBER?

И вообще, не тратьте время зря. Приведите пример данных. Не обязательно реальных, не обязательно 100500 строк. 3 - 4 строки - пример того, что получается сейчас, 3 - 4 строки - какой результат хочется видеть. И в двух словах, чем они друг от друга отличаются.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39446258
А где проектирование БД?
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39448839
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никанор КузьмичВот для начала: у вас в секции GROUB BY перечислены 8 разных полей. Вы в курсе, что если у вас одному и тому же значению DOC.D_NUMBER соответствуют, например, 3 разных значения ORD.ID_CODE, то у вас будет в результате 3 строки с одинаковым DOC.D_NUMBER? А в курсе, как сделать так, чтобы осталось по одной строке на один DOC.D_NUMBER?.

Бинго!!! Вот именно это и имелось в виду!
Вот теперь КАК сделать так, чтобы осталось по одной строке на один DOC.D_NUMBER?
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39448854
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это зависит от того, какие у вас данные и структура таблиц. Не зная этого, можно только посоветовать убрать из GROUP BY все поля, кроме DOC.D_NUMBER.
(Можно еще посоветовать почитать учебник, но что-то мне подсказывает, что вы не будете)
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450594
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сильно урезал код для общего понимания
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT ORD.ID_CODE,
       MAX(DOC.D_NUMBER),
       COALESCE(SUM(IORD.VD_OUTSUM_N) * ORD.D_DELSTAT, 0)

FROM D_ORDER ORD

LEFT JOIN VD_ITEMSORDER IORD ON IORD.ID_ORDER = ORD.ID_CODE
LEFT JOIN D_DOCUMENT DOC ON DOC.ID_ORDER = ORD.ID_CODE
WHERE ORD.ID_CODE = 963

GROUP BY
    ORD.ID_CODE,
    DOC.D_NUMBER,
    ORD.D_DELSTAT
;



Результат запроса следующий (рис 1). Значение в поле COALESCE должно быть в 2 раза меньше, т.к. в таблице D_DOCUMENT на наш ID есть две записи (рис 2).

В идеале запрос должен выводить сумму с максимальным значением поля DOC.D_NUMBER но только один раз.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450595
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450626
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranЗначение в поле COALESCE должно быть в 2 раза меньше, т.к. в таблице D_DOCUMENT на наш ID есть две записи (рис 2).Значит надо переписать запрос так, чтобы одна из строк отсеивалась. Например, в секцию WHERE условие или подзапрос или еще что-то.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450639
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот куда добавить условие о максимальном значение поля даты и времени таблицы D_DOCUMENT? По идее только так можно оставить одну строку и тогда вообще уйти от поиска макс.значения поля DOC.D_NUMBER
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450661
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranВот куда добавить условие о максимальном значение поля даты и времени таблицы D_DOCUMENT?Например, в подзапрос. Который сначала вернет только нужные строки из таблицы, а потом сджойнится с остальными.
HadroranПо идее только так можно оставить одну строкуА это от вашей СУБД зависит. В оракле я наверно 3 - 4 способа назову, как сделать это.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450707
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СУБД - Firebird. Инструмент IBExpert.

Вот запрос, который работает как надо.
Код: sql
1.
2.
3.
select d_number, MAX(d_date), max(d_time)
from d_document
group by d_number



помогите добавить его, но теоретически в запросе нужен только d_number.
...
Рейтинг: 0 / 0
Про макс.значение поля
    #39450823
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача решена:
Код: sql
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.
27.
28.
29.
SELECT ORD.ID_CODE,
       DOC.D_NUMBER,
       CCT.VD_NAME, 
       USR.U_NAME,
       ORD.D_DELSTAT,
       ORD.D_NUMBER, ORD.D_DATE, 
       COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0),
       ORD.D_DESC

FROM D_ORDER ORD

LEFT JOIN VD_ITEMSORDER IORD ON IORD.ID_ORDER = ORD.ID_CODE
LEFT JOIN VD_CUSTCONTACT CCT ON CCT.ID_CODE   = ORD.ID_CUSTOMER
LEFT JOIN D_USER USR ON USR.ID_CODE   = ORD.ID_CALLUSER
LEFT JOIN D_DOCUMENT DOC ON DOC.ID_CODE =
(select first 1 id_code
  from d_document
  where id_order = ORD.ID_CODE
  order by d_date desc, d_time desc, id_code desc)

GROUP BY
    ORD.ID_CODE,
    DOC.D_NUMBER,
    CCT.VD_NAME,
    USR.U_NAME,
    ORD.D_DELSTAT,
    ORD.D_NUMBER, ORD.D_DATE,
    ORD.D_DESC
;
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Про макс.значение поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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