Конференция "Начинающим" » Уникальная выборка из таблицы Firebird 2.5 [D7, XP]
 
  • Тимофей (09.11.17 21:42) [0]
    Добрый вечер мастера! Помогите составить запрос please..
    есть таблица MYTABLE для примера(c полями: фамилия, сумма):

    Иванов   50
    Иванов   30
    Сидоров 20
    Сидоров 10
    Петров  100

    нужно сделать выборку и привести при отображении в дбгрид к виду:

    Иванов   80
    Сидоров 30
    Петров  100

    тоесть суммировать данные без повторений ФИО, пробовал всякоразными способами используя DISTINCT но все время вылетает ошибка выполнения запроса.. (( Как правильно составить запрос для такой выборки?
  • aka © (09.11.17 22:14) [1]
    select  name, sum(summa)
    from MYTABLE
    group by name
  • Тимофей (09.11.17 22:33) [2]
    >aka  Спасибо, работает! Но есть еще один нюанс, для упрощения примера не упомянул ранее что в таблице  есть еще одно поле ZDATE, в которое вносится дата когда поступили деньги от клиента:

    Иванов   50   01.01.2017
    Иванов   30   02.01.2017
    Сидоров 20   05.01.2017
    Сидоров 10   06.01.2017
    Петров  100  09.01.2017

    При выборке нужно например за месяц показать все данные. Соответственно в select и group by упоминаю ZDATE (с помощью HAVING пишу условие: мес.период).
    Если один и тот же клиент внес сумму в один день то результат выборки как надо:
    Иванов   80
    Сидоров 30
    Петров  100

    но если клиент внес деньги в разные дни то результат получается  как и в таблице то есть без группировки по клиенту, мешает группировка по дате:

    Иванов   50
    Иванов   30
    Сидоров 20
    Сидоров 10
    Петров  100

    Как от нее избавиться? Попытка выкинуть дату из селекта и/или групбай приводит к ошибкам выполнения запроса.. (( HAVING-у нужна дата.. ((
  • Тимофей (09.11.17 22:36) [3]
    Получается замкнутый круг, дата нужна для выборки данных за нужный период и она же мешает группировке по клиентам, поскольку суммы поступали в разные дни, а нужно отобразить без группировки по дате, а только с группировкой по клиентам и подсчетом общих сумм.. ((
  • Тимофей (09.11.17 22:38) [4]
    и таблица большая, за весь год, с разными датами.. ((
  • Тимофей (09.11.17 22:40) [5]
    а выборка делается при просмотре за определенный месяц например с 1 по 30(31) число.. (использую функцию кол.дней в месяце)
  • Inovet © (09.11.17 22:45) [6]
    > [2] Тимофей   (09.11.17 22:33)
    > мешает группировка по дате:

    Ну допустим удастся сгруппировать без группировки по дате, какое должно быть значение в поле дата? Если ответ на этот вопрос есть, то можно сделать, если ответа нет, значит дата в выборке не нужна.
  • Inovet © (09.11.17 22:51) [7]
    > [5] Тимофей   (09.11.17 22:40)
    > (использую функцию кол.дней в месяце)

    Не надо в HAVING дату ограничивать. Количество дне тоже вроде как лишнее. Здесь достаточно
    WHERE F1 BETWEEN :DATE_FROM AND :DATE_TO
    а в программе присвоить параметрам нужные значения.
  • Тимофей (09.11.17 22:54) [8]
    >Inovet  
    оч.странно, но удалось побороть ошибки выкинув ZDATE из select и group by а еще заменил HAVING на WHERE )) в чем между ними разница так и не понял, но пашет теперь как надо...
    про BETWEEN незнал, буду использовать.. СпасибО!
  • Тимофей (09.11.17 22:58) [9]
    Откуда WHERE берет ZDATE для выборки по условие за месяц тоже непонятно.. ведь в select его нет.. )) но факт налицо, результирующая выборка правильная.. парадокс огнептички.. ))
  • Тимофей (09.11.17 23:02) [10]
    как-то так: select .. from .. where .. group by .. order by .. ))
  • Inovet © (09.11.17 23:05) [11]
    > [9] Тимофей   (09.11.17 22:58)
    > парадокс огнептички

    Это как раз нормальное поведение в выборке поля нет, а в таблице оно никуда не делось.
    WHERE фильтрует сначала, а HAVING по группировке, например HAVING SUM(F1) > 0
  • Тимофей (09.11.17 23:12) [12]
    >Inovet  
    Поэтому я так понимаю в HAVING должно быть всегда то что в select? А в WHERE похоже можно писать все что угодно из полей таблицы независимо от упоминания в select-е .. )) забавно, не знал.. ))
 
Конференция "Начинающим" » Уникальная выборка из таблицы Firebird 2.5 [D7, XP]
Есть новые Нет новых   [118645   +50][b:0][p:0.001]