#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