Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Про макс.значение поля / 20 сообщений из 20, страница 1 из 1
27.04.2017, 10:58
    #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
27.04.2017, 11:24
    #39445298
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
HadroranЕсть проблемка в работе след. кода
...
Значение COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) суммируется столько раз, сколько записей в D_DOCUMENT
Помогите исправить.Код работает правильно. Можете не благодарить.
...
Рейтинг: 0 / 0
27.04.2017, 12:06
    #39445343
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Вот именно. Несколько раз. А надо тока один :(
...
Рейтинг: 0 / 0
27.04.2017, 12:42
    #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
27.04.2017, 12:42
    #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
27.04.2017, 13:14
    #39445390
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
DOC.D_NUMBER не уникален для каждой записи в D_DOCUMENT и может повторяться несколько раз, поэтому тех записях, где DOC.D_NUMBER имеет одно или несколько, но разных значений, результаты запроса удовлетворяют. Но если DOC.D_NUMBER имеет несколько одинаковых значений и они все максимальные, то COALESCE(SUM(IORD.VD_OUTSUM) * ORD.D_DELSTAT, 0) работает столько раз, сколько есть этих одинаковых максимальных значений.
...
Рейтинг: 0 / 0
27.04.2017, 13:15
    #39445391
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Никанор КузьмичТолько сейчас заметил:[src]
А что за СУБД, кстати?

Firebird 2.5
...
Рейтинг: 0 / 0
27.04.2017, 17:03
    #39445624
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Тема актуальна
...
Рейтинг: 0 / 0
27.04.2017, 17:08
    #39445628
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Используйте подзапросы
...
Рейтинг: 0 / 0
28.04.2017, 00:43
    #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
28.04.2017, 16:45
    #39446258
Про макс.значение поля
А где проектирование БД?
...
Рейтинг: 0 / 0
04.05.2017, 16:12
    #39448839
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Никанор КузьмичВот для начала: у вас в секции GROUB BY перечислены 8 разных полей. Вы в курсе, что если у вас одному и тому же значению DOC.D_NUMBER соответствуют, например, 3 разных значения ORD.ID_CODE, то у вас будет в результате 3 строки с одинаковым DOC.D_NUMBER? А в курсе, как сделать так, чтобы осталось по одной строке на один DOC.D_NUMBER?.

Бинго!!! Вот именно это и имелось в виду!
Вот теперь КАК сделать так, чтобы осталось по одной строке на один DOC.D_NUMBER?
...
Рейтинг: 0 / 0
04.05.2017, 16:30
    #39448854
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
А это зависит от того, какие у вас данные и структура таблиц. Не зная этого, можно только посоветовать убрать из GROUP BY все поля, кроме DOC.D_NUMBER.
(Можно еще посоветовать почитать учебник, но что-то мне подсказывает, что вы не будете)
...
Рейтинг: 0 / 0
10.05.2017, 10:15
    #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
10.05.2017, 10:16
    #39450595
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
...
Рейтинг: 0 / 0
10.05.2017, 10:55
    #39450626
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
HadroranЗначение в поле COALESCE должно быть в 2 раза меньше, т.к. в таблице D_DOCUMENT на наш ID есть две записи (рис 2).Значит надо переписать запрос так, чтобы одна из строк отсеивалась. Например, в секцию WHERE условие или подзапрос или еще что-то.
...
Рейтинг: 0 / 0
10.05.2017, 11:08
    #39450639
Hadroran
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
Вот куда добавить условие о максимальном значение поля даты и времени таблицы D_DOCUMENT? По идее только так можно оставить одну строку и тогда вообще уйти от поиска макс.значения поля DOC.D_NUMBER
...
Рейтинг: 0 / 0
10.05.2017, 11:34
    #39450661
Никанор Кузьмич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про макс.значение поля
HadroranВот куда добавить условие о максимальном значение поля даты и времени таблицы D_DOCUMENT?Например, в подзапрос. Который сначала вернет только нужные строки из таблицы, а потом сджойнится с остальными.
HadroranПо идее только так можно оставить одну строкуА это от вашей СУБД зависит. В оракле я наверно 3 - 4 способа назову, как сделать это.
...
Рейтинг: 0 / 0
10.05.2017, 12:49
    #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
10.05.2017, 14:35
    #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]