【问题标题】:SELECT a column and SUM() of values from another table in SQL从 SQL 中的另一个表中选择一列和 SUM() 值
【发布时间】:2016-06-13 19:21:28
【问题描述】:

我对 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;

这会引发语法错误,我不确定如何继续。

这只是我需要解决的此类问题的一个示例,因此更通用的答案会有所帮助。

提前致谢!

编辑:

在答案的帮助下,我最终得到了这段代码,它只获得了总收入,并将其放在数据库名称中的第一个人旁边。我在这里做错了什么?

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;

【问题讨论】:

  • 这是 mysql 还是 sql-server?没关系,因为这些东西到处都是相当标准的。但是不要用阳光下的每个数据库来标记您的问题 - 只是您实际使用的数据库。错误信息具体是什么?
  • 您需要group by。我也在删除无关的数据库标签。
  • 我猜是子查询缺少别名。 subqeries 需要一个别名,即使它从未真正使用过。 select * from (select ...) as subselect
  • '错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 3 行的“SELECT orderline.order_qty * items.unit_value FROM orderline INNER JOIN”附近使用正确的语法

标签: mysql sql select sum


【解决方案1】:

您的查询存在几个问题。 首先,您需要确定子查询的范围并为其设置别名:

(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)。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-13
          • 1970-01-01
          • 2022-01-05
          • 1970-01-01
          • 2012-01-30
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多