Неправильный синтаксис рядом с ключевым словом ‘select’. сведения о сотрудниках с наибольшей стоимостью покупки

#sql #sql-server

#sql #sql-сервер

Вопрос:

Код для создания таблиц для имени клиента и деталей заказа:

 CREATE TABLE customers_demo_1 (
    id INTEGER NOT NULL,
    name TEXT,
    email TEXT);
    
INSERT INTO customers_demo_1 (id, name, email) VALUES (1, 'Doctor Who', 'doctorwho@timelords.com');
INSERT INTO customers_demo_1  (id, name, email) VALUES (2, 'Harry Potter', 'harry@potter.com');
INSERT INTO customers_demo_1  (id, name, email) VALUES (3, 'Captain Awesome', 'captain@awesome.com');

CREATE TABLE orders_demo_1 (
    id INTEGER NOT NULL,
    customer_id INTEGER,
    item TEXT,
    price REAL);

INSERT INTO orders_demo_1  (id, customer_id, item, price)
    VALUES (111, 1, 'Sonic Screwdriver', 1000.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (211,2, 'High Quality Broomstick', 40.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (311,3, 'TARDIS', 1000000.00);
    
INSERT INTO orders_demo_1  (id, customer_id, item, price)
    VALUES (111, 1, 'Item2', 1300.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (112, 1, 'Item3', 400.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (111,1, 'Item7', 1900000.00);

INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (311,3, 'Item5', 1200.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (312,3, 'Item4', 1990.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (211,2, 'Item9', 2300.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (212,2, 'Item10', 2400.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (211,2, 'Item11', 5000.00);
INSERT INTO orders_demo_1  (id,customer_id, item, price)
    VALUES (212,2, 'Item12', 8000.00);
  

Код:

 select * from(
select customer_id, id, 
sum(price) as Order_price_overall,
RANK() over (partition by customer_id order by sum(price) desc) as rank_order_value,
count(*) over(partition by customer_id) as no_of_orders
from orders_demo_1 o
group by id, customer_id
) t
inner join
select name,email from customers_demo_1 c
on t.customer_id=c.id

where t.rank_order_value=1 
  

Я хочу, чтобы отображалась наибольшая стоимость продаж на одного клиента.

Ошибка:

 Incorrect syntax near the keyword 'select'.
Msg 156, Level 15, State 1, Line 63
Incorrect syntax near the keyword 'on'.
  

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

 customer_id   Name                id     Order_price_overall   Rank_order_value     no_of_orders
1             Doctor who         111     1902300                    1                     2
2             Harry Potter       212     10400                    1                   2
3             Captain Awesome    311     1001200                      1                   2
  

Комментарии:

1. Отсутствуют круглые скобки: inner join (select name,email from customers_demo_1) c

2. по-прежнему не работает, я получаю ошибку: неверный идентификатор

3. Спасибо, что задали такой хороший вопрос — определения таблиц, образцы данных, ожидаемые результаты — именно то, что мы хотим!

4. @NevilleKuyt если вы считаете, что это хорошо, пожалуйста, поддержите вопрос

Ответ №1:

Исправлен синтаксис

     SELECT *
FROM (
    SELECT customer_id
        ,id
        ,sum(price) AS Order_price_overall
        ,RANK() OVER (
            PARTITION BY customer_id ORDER BY sum(price) DESC
            ) AS rank_order_value
        ,count(*) OVER (PARTITION BY customer_id) AS no_of_orders
    FROM orders_demo_1 o
    GROUP BY id
        ,customer_id
    ) t
INNER JOIN (
    SELECT id
        ,name
        ,email
    FROM customers_demo_1
    ) c ON t.customer_id = c.id
WHERE t.rank_order_value = 1
  

Ответ №2:

Это работает для меня:

 select t.customer_id, t.Order_price_overall,t.no_of_orders,t.id as OrderId, t.rank_order_value, c.name, c.email from(
select customer_id, id, 
sum(price) as Order_price_overall,
RANK() over (partition by customer_id order by sum(price) desc) as rank_order_value,
count(*) over(partition by customer_id) as no_of_orders
from orders_demo_1 o
group by id, customer_id
) t
inner join
(select * from customers_demo_1) c
on t.customer_id=c.id

where t.rank_order_value=1