2016-06-13 2 views
0

Я довольно новичок в SQL, и это вызывает у меня проблемы. Идея состоит в том, что у меня есть несколько таблиц. Вот соответствующие таблицы и столбцы:ВЫБЕРИТЕ столбец и значение SUM() из другой таблицы в SQL

customers: 

customer_id, customer_name 


orders: 

order_id, customer_id 


orderline: 

order_id, item_id, order_qty 


items: 

item_id, unit_price 

Мне нужно вернуться customer_name, а также общий доход от этого клиента (рассчитывается как ITEM_PRICE * order_qty * 2).

Вот что я написал:

SELECT customers.customer_name, sum(revenue) 
    FROM SELECT orderline.order_qty * items.unit_value * 2 AS revenue 
     FROM orderline 
      INNER JOIN orders 
      ON orderline.order_id = orders.order_id 
    INNER JOIN customers 
     ON revenue.customer_id = customers.customer_id; 

Это бросает синтаксическую ошибку, и я не совсем уверен, как поступить.

Это только один пример такого типа проблем, который мне нужно разработать, поэтому более обобщенные ответы были бы полезными.

Заранее благодарен!

EDIT:

С помощью ответов я заканчивал с этим кодом, который просто получает общий доход и ставит его рядом с первым человеком в имени децибел. Что я здесь не так понял?

SELECT customers.customer_name, sum(revenue) 
    FROM(SELECT orderline.order_qty * items.unit_price * 2 AS revenue, orders.customer_id AS CustomerID 
     FROM(orderline 
      INNER JOIN orders 
      ON orderline.order_id = orders.order_id 
       INNER JOIN items 
       ON orderline.item_id = items.item_id)) CustomerOrders 
    INNER JOIN customers 
     ON CustomerOrders.CustomerID = customers.customer_id; 
+0

так что это mysql или sql-сервер? не то, что это имеет значение, так как этот материал довольно стандартный везде. но не помещайте свои вопросы с каждым db под солнцем - только тот, который вы на самом деле используете. И что конкретно представляет собой сообщение об ошибке? –

+1

Вам нужна группа. Я также удаляю посторонние теги базы данных. –

+0

Я предполагаю, что это недостаток псевдонима в подзапросе. subqeries нужен псевдоним, даже если он никогда не используется. 'select * from (select ...) as subselect' –

ответ

0
SELECT c.customer_name, 
     sum(COALESCE(ol.order_qty,0) * COALESCE(i.unit_value,0) * 2) 
FROM customers c 
INNER JOIN orders o 
ON o.customer_id = c.customer_id; 
INNER JOIN orderline ol 
ON ol.order_id = o.order_id 
INNER JOIN items i 
ON i.item_id = ol.item_id 
GROUP BY c.customer_id 
0
select customer_name, sum(item_price * order_qty * 2) as total_revenue 
from (
    select * from customers 
    inner join orders using(customer_id) 
    inner join orderline using(order_id) 
    inner join items using(item_id) 
) 
group by customer_name 
0
select 
    c.customer_name, 
    r.revenue 
from 
    customers c 
inner join 
    orders ord on 
    ord.customer_id = c.customer_id 
inner join 
    (select i.item_id, o.order_id, sum(o.order_qty * items.unit_value * 2) as revenue 
    from orderline o 
    inner join items i on 
    i.item_id = o.item_id 
    group by o.order_id, i.item_id) as r on r.order_id = o.order_id 
0

Пара вопросов с запросом. Во-первых, вы должны рамки вашего подзапрос и псевдоним он:

(SELECT orderline.order_qty * items.unit_value * 2 AS revenue 
    FROM orderline 
     INNER JOIN orders 
     ON orderline.order_id = orders.order_id) CustomerOrders 

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

(SELECT 
    orderline.order_qty * items.unit_value * 2 AS revenue, 
    orders.customer_id AS CustomerId 
FROM 
    orderline 
INNER JOIN orders ON orderline.order_id = orders.order_id) CustomerOrders 

Тогда вам нужно использовать псевдоним подзапроса в соединении с таблицей клиентов и обернуть его все в группе customer_id и CustomerOrders.Revenue

Я хотел бы сделать это по-другому. Я бы начал с выбора из таблицы клиентов, потому что это основа того, что вы ищете. Затем я применил бы крест по заказам, которые бы все агрегировали доход заказа в подзапросе. Это будет выглядеть следующим образом (TSQL, вы могли бы сделать то же самое в MySQL с объединением с некоторой агрегации):

SELECT 
    customers.customer_name, 
    ISNULL(customerOrders.Revenue, 0) AS Revenue 
FROM 
    customers 
OUTER APPLY (
    SELECT 
     SUM (orderline.order_qty * items.unit_value * 2) AS Revenue 
    FROM 
     orders 
    INNER JOIN 
     orderline ON orders.order_id = orderline.order_id 
    INNER JOIN 
     items on orderline.item_id = items.item_id 
    WHERE 
     orders.customer_id = customers.customer_id 
) CustomerOrders 

В этом случае, агрегаты подзапрос все ваши заказы для вас и возвращает только одну строку для каждого клиента, поэтому нет посторонних возвращенных данных. Так как это внешний вид, он также возвращает null для клиентов без заказов. Вы можете изменить его на CROSS APPLY, и он будет отфильтровывать клиентов без заказов (например, INNER JOIN).

Смежные вопросы