【问题标题】:How to get all products from one order to the list如何从一个订单中获取所有产品到列表
【发布时间】:2019-04-02 15:32:55
【问题描述】:

我写了一个返回数据的查询,这是我的代码

SELECT o.Id, p.ProductName, po.Quantity, p.Price, DeliveryMethod, 
OrderDate, TotalSum, u.UserName FROM [Order] o
JOIN ProductsOrders po ON o.Id = po.OrderId
JOIN Product p ON po.ProductId = p.Id
JOIN Users u ON o.UserId = u.Id
ORDER BY o.Id

然后它返回下一个:

OrderId ProductName Quantity Price DeliveryMethod OrderDate TotalSum UserName
98         Bed3       1      3000    Express    2018-08-04  7015    Ivan
98         Bed4       1      4000    Express    2018-08-04  7015    Ivan
100        Bed2       1      2000               2018-08-05  2000    Ivan
101        Bed2       1      2000               2018-08-05  5000    Ivan
101        Bed3       1      3000               2018-08-05  5000    Ivan
102        Bed0       1        0    Standard    2018-09-04  1005    Ivan

我们可以注意到,对于每个产品 - 一条记录

但我想按一个订单对所有产品进行分组并得到类似的结果:

- orderId
- deliveryMethod
- userName
  - product1   quantity    price
  - ...
  - productN   quantity    price
- totalAmount

101
Courier
John Doe
  Black bag       1   1500
  Fat Bike        1   5000
  Thermos bottle  5   200
Total amount      7500

如何修改查询?

【问题讨论】:

  • 您想要做的工作看起来像是 SQL Server Reporting Services (SSRS)、Microsoft Excel 或其他实用程序的工作。以这种格式显示查询结果的任何尝试都类似于使用牙刷粉刷墙壁。
  • 这个数据库有 ORM(即 Django)吗?如果您有与表对应的数据模型,那么您可以轻松地做到这一点。

标签: sql sql-server linq


【解决方案1】:

IMO,正确的做法是选择 2 个数据集。第一个数据集包含父订单数据,第二个数据集包含第一个数据集中订单的各个 ProductsOrders(产品线项目)。

-- Select Orders
SELECT
     [o].[Id] AS [OrderId]
    ,[o].[DeliveryMethod]
    ,[o].[OrderDate]
    ,[u].[UserName]
FROM [Order] [o]
    INNER JOIN [Users] [u] ON [o].[UserId] = [u].[Id]
WHERE
    [o].[Id] IN(SomeRangeOfOrderIds) -- (Or however you'd like to filter the results)


-- Select Products (product line items)
SELECT
     [p].[ProductName]
    ,[po].[Quantity]
    ,[p].[Price]
FROM [ProductsOrders] [po]
    INNER JOIN [Product] [p] ON [po].[ProductId] = [p].[Id]
WHERE
    [po].[OrderId] IN(SameRangeOfOrderIdsAsTheQueryAbove)

...然后获取这些结果并根据需要显示它们。这会出现在报告中吗?还是在网页上?

【讨论】:

    【解决方案2】:

    我刚刚在 LINQ 中实现了这个问题。应该注意到有多对多的关系

    var orders = db.Orders.Select(o => new
            {
                o.Id,
                o.DeliveryMethod,
                o.OrderDate,
                o.UserId,
                o.TotalSum,
                Products = o.ProductsOrders.Select(p => new { p.Product.ProductName, p.Quantity, p.Product.Price}).ToList()
            }).ToList();
    

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 2017-09-25
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多