SQL SELECT данные из группы таблиц по разным данным - PullRequest
0 голосов
/ 16 июня 2019

Показать pymtmode, и общее количество платежей для тех платежей, которые были оплачены до 2015 года, и общее количество платежей должно быть больше 1 из предоставленных данных:

ORDERID QUOTATIONID QTYORDERED  ORDERDATE   STATUS  PYMTDATE    DELIVEREDDATE   AMOUNTPAID  PYMTMODE
O1001   Q1002   100 30-OCT-14   Delivered   05-NOV-14   05-NOV-14   140000  Cash
O1003   Q1003   50  15-DEC-14   Delivered   18-DEC-14   20-DEC-14   310000  Cash
O1004   Q1006   100 15-DEC-14   Delivered   25-DEC-14   30-DEC-14   80000   Cheque
O1005   Q1002   50  30-JAN-15   Delivered   01-FEB-15   03-FEB-15   70000   Cheque
O1006   Q1008   75  20-FEB-15   Delivered   22-FEB-15   23-FEB-15   161250  Cash

Я пробовалниже приведен код для выбора года и выбора только значений до 2015 года и группировки по годам.

SELECT pymtmode, COUNT(*) as pymtcount 
FROM orders 
GROUP BY to_char(pymtdate, 'Year') 
HAVING to_char(pymtdate,'Year')<2015 AND count(*)>1

Я узнал, что группировка по столбцам / функциям также должна быть упомянута в операторе SELECT.Но этот вопрос и ожидаемый результат к нему не относятся.Ясность с основными объяснениями поможет

Ожидаемый результат

PYMTMODE    PYMTCOUNT
  Cash         2 

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

Я настоятельно рекомендую использовать для этой цели прямые сравнения дат:

SELECT o.pymtmode, COUNT(*) as pymtcount 
FROM orders o
WHERE o.pymtdate < DATE '2015-01-01'
GROUP BY o.pymtmode
HAVING COUNT(*) > 1; 

Примечания:

  • Вы хотите выполнить фильтрацию до агрегации, а не после. Я думаю, что это источник вашего замешательства.
  • Прямое сравнение с датами облегчает оптимизатору создание наилучшего плана выполнения.
  • Научиться использовать псевдонимы таблиц (o) - хорошая привычка.
0 голосов
/ 16 июня 2019

Ваш ожидаемый результат должен быть выбран pymtmode, поэтому вы должны GROUP BY pymtmode, а не GROUP BY to_char(pymtdate, 'Year'), потому что вам не нужно получать результаты за каждый год, верно?Также условие to_char(pymtdate,'Year')<2015 может быть также помещено в предложение WHERE, чтобы ограничить строки перед агрегированием:

SELECT pymtmode, COUNT(*) as pymtcount 
FROM orders 
WHERE EXTRACT(YEAR FROM pymtmode) < 2015
GROUP BY pymtmode 
HAVING count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...