繁体   English   中英

3个链接表之间的总和SQL Server

[英]Sum between 3 linked tables SQL Server

我正在尝试从链接表中提取一笔款项。

订购

OrderID     LocationID  OrderDate
100         1           1/1/2000
200         2           1/2/2000

OrderedItems

ID          OrderID     ItemID
1           100         1
2           200         2
3           200         2
4           100         3

OrderItem

ItemID      ItemName    Cost
1           Mobile1     100.00
2           Mobile2     200.00
3           Mobile3     300.00

Order表实际上是一组OrderedItems OrderedItems每一行都通过ItemID链接回到OrderItem

我正在尝试在下面的查询中添加一列订单总数。

Order Number    Location    Date Ordered    Order Total
-------------------------------------------------------
100             Sydney      1/1/2000        400
200             Brisbane    1/2/2000        400

我当前查询是:

SELECT  
    Order.OrderID AS [Order Number],
    OL.Name AS [Location],
    Order.OrderDate AS [Date Ordered]
FROM
    Order
LEFT JOIN 
    Office_Locations AS OL ON OL.id = Order.LocationID

我尝试遵循此链接,但是我需要通过3个表进行链接以添加值。

任何麻将都很棒!

您没有从三个表中找到总和。 您可以从一个表中找到一个总和:OrderItem表。 唯一的技巧是正确完成JOINGROUP BY表达式以使该列可用。

SELECT o.OrderID As [Order Number], l.Name As Location
    , o.OrderDate As [Date Ordered], SUM(i.Cost) As [Order Total]
FROM [Order] o
INNER JOIN Office_Locations l on l.id = o.LocationID
INNER JOIN OrderedItems oi on oi.OrderID = o.OrderID
INNER JOIN OrderItem i ON i.ItemID = oi.ItemID
GROUP BY o.OrderID, l.Name, o.OrderDate

SQLFIDDLE

您需要使用SUM来获得总Cost

SQL小提琴

SELECT
    [Order Number]  = o.OrderID,
    Location        = ol.Name,
    [Date Ordered]  = o.OrderDate,
    [Order Total]   = SUM(i.Cost)
FROM [Order] o
INNER JOIN OrderedItems oi
    ON oi.OrderId = o.OrderId
INNER JOIN OrderItem i
    ON i.ItemID = oi.ItemID
LEFT JOIN Office_Locations ol
    ON ol.id = o.LocationID
GROUP BY
    o.OrderID, o.OrderDate, ol.Name

正如Joel Coehoorn所评论的那样,在OrderedItems表中具有quantity字段比重复它们更为正常。 按照他的建议,您的OrderedItems表应为:

ID          OrderID     ItemID  Quantity
1           100         1       1
2           200         2       2
3           100         3       1

补充笔记:

  • 使用有意义的别名以提高可读性。
  • 不要将保留字用作对象名称,即Order可以重命名为OrderHeader

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM