Синтаксическая проблема с агрегатными функциями и подзапросами - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь запросить 3 таблицы базы данных Заказы, клиент и продавец. Для того, чтобы найти больше информации о недавних выступлениях продавца. Требуемые категории - это идентификатор, возраст, количество заказов, где amout> 1000, был заказ, где сумма> 500 (y / n), количество обслуживаемых уникальных клиентов, дни с последнего заказа и, наконец, сумма последнего заказа.

Мой код похож на следующий, его также можно посмотреть по ссылке:

SELECT  o.salesperson_id
    s.Age,
    (CASE WHEN o.Amount > 500 THEN 'Yes' ELSE 'No' END) AS 'Had Order Bigger Than 500?',
    (datediff(day,o.order_date,GETDATE())) AS 'Days Since Last Order',

    o.Amount as 'Last Order Amount'
    FROM Orders o INNER JOIN Salesperson s ON o.salesperson_id = s.ID
      WHERE o.Amount IN
      (SELECT o.Amount WHERE o.order_date = MAX (o.order_date) FROM Orders)

    GROUP BY o.salesperson_id 
    HAVING (COUNT (DISTINCT o.cust_id)) AS 'Number of Unique Customers Served',
    (SUM(CASE WHEN o.Amount > 1000 THEN 1 ELSE 0 END)) AS 'Number of Orders Bigger Than 1000'

    ORDER BY o.salesperson_id;

http://sqlfiddle.com/#!18/4fc5c/69

Автоматический отладчик сообщает, что проблема связана с моим ОТ, но яя тупой основатель

Неверный синтаксис рядом с ключевым словом 'FROM'

Мой ожидаемый результат будет примерно таким:

+----------------+-----------------+-----------------------------------+-----------------------------------+-----------------------------------+-----------------------+-------------------+
| Salesperson ID | Salesperson Age | Number of Orders Bigger Than 1000 | Had Order Bigger Than 500? (y/n)  | Number of Unique Customers Served | Days Since Last Order | Last Order Amount |
+----------------+-----------------+-----------------------------------+-----------------------------------+-----------------------------------+-----------------------+-------------------+
|              1 |              61 |                                 0 | N                                 |                                 1 |                       |               460 |
|              2 |              34 |                                 1 | Y                                 |                                 2 |                       |              2400 |
|              8 |              57 |                                 1 | y                                 |                                 1 |                       |              1800 |
+----------------+-----------------+-----------------------------------+-----------------------------------+-----------------------------------+-----------------------+-------------------+

Было бы крайнеценить всю полученную помощь.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Присоединяйтесь к продавцу и заказам, группируйте по продавцу и используйте условное агрегирование:

select
  s.ID [Salesperson ID], 
  s.Age [Salesperson Age],
  sum(case when o.Amount > 1000 then 1 else 0 end) [Number of Orders Bigger Than 1000],
  case when sum(case when o.Amount > 500 then 1 else 0 end) > 0 then 'Yes' else 'No' end [Had Order Bigger Than 500? (y/n)],
  count(distinct cust_id) [Number of Unique Customers Served],
  datediff(day, max(o.order_date), GETDATE()) [Days Since Last Order],
  (select Amount from Orders where salesperson_id = s.ID and order_date = max(o.order_date))[Last Order Amount]
from Salesperson s inner join Orders o
on o.salesperson_id = s.ID
group by s.ID, s.Age
order by s.ID

См. Демонстрационную версию . Результаты:

> Salesperson ID | Salesperson Age | Number of Orders Bigger Than 1000 | Had Order Bigger Than 500? (y/n) | Number of Unique Customers Served | Days Since Last Order | Last Order Amount
> -------------: | --------------: | --------------------------------: | :------------------------------- | --------------------------------: | --------------------: | ----------------:
>              1 |              61 |                                 0 | No                               |                                 1 |                  8883 |               460
>              2 |              34 |                                 1 | Yes                              |                                 2 |                  7953 |              2400
>              8 |              57 |                                 1 | Yes                              |                                 1 |                  7587 |              1800
0 голосов
/ 08 ноября 2019

Ваш запрос syntax совершенно неверен. Пожалуйста, попробуйте это.

FIDDLE DEMO

SELECT  o.salesperson_id, s.Age,
     (SUM(CASE WHEN o.Amount > 1000 THEN 1 ELSE 0 END)) AS 'Number of Orders Bigger Than 1000',
     (CASE WHEN o.Amount > 500 THEN 'Yes' ELSE 'No' END) AS 'Had Order Bigger Than 500?',
     (COUNT (o.cust_id)) AS 'Number of Unique Customers Served',
     (datediff(day,o.order_date,GETDATE())) AS 'Days Since Last Order',
     o.Amount as 'Last Order Amount'  
FROM Orders o INNER JOIN Salesperson s ON o.salesperson_id = s.ID
WHERE o.Amount IN
( 
  SELECT Amount 
  FROM Orders OO
  WHERE order_date IN (SELECT MAX(order_date) FROM Orders GROUP BY salesperson_id)
)
GROUP BY o.salesperson_id,s.Age,o.Amount, (datediff(day,o.order_date,GETDATE()))
ORDER BY o.salesperson_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...