以下是我的源数据的粗略示例:
OrderStatus | CustomerID | OrderNbr | LoadNbr | Product | Quantity
------------+------------+----------+---------+---------+---------
OPEN | 1 | ORD00001 | 1 | 0012 | 12
OPEN | 1 | ORD00001 | 2 | 0024 | 20
我想要达到的结果是:
OrderStatus | CustomerID | OrderNbr | Prod01 | Quantity01 | Prod02 | Quantity02 | Ratio01 | Ratio02
-------------+------------+----------+--------+------------+--------+------------+---------+---------
OPEN | 1 | ORD00001 | 0012 | 12 | 0024 | 20 | 37.5 | 62.5
为了简洁起见,我只列出了2个产品.但在我得到的数据中,可能有8种以上的产品.
我一直在try 的是:
WITH OrderSummary AS (
SELECT O.OrderStatus,
O.CustomerID,
O.OrderNbr,
'TotalQty' = I1.Quantity + I2.Quantity,
'Prod01' = I1.Product,
'Quantity01' = I1.Quantity,
'Prod02' = I2.Product,
'Quantity02' = I2.Quantity
FROM Orders O
LEFT JOIN Orders I1 ON O.OrderNbr = I1.OrderNbr AND I1.LoadNbr = 1
LEFT JOIN Orders I2 ON O.OrderNbr = I2.OrderNbr AND I1.LoadNbr = 2
)
SELECT *,
'Ratio01' = Quantity01 / TotalQty * 100,
'Ratio02' = Quantity02 / TotalQty * 100
FROM OrderSummary
这或多或少是我目前正在运行的.但我得到的结果是这样的:
OrderStatus | CustomerID | OrderNbr | Prod01 | Quantity01 | Prod02 | Quantity02 | Ratio01 | Ratio02
-------------+------------+----------+--------+------------+--------+------------+---------+---------
OPEN | 1 | ORD00001 | 0012 | 12 | 0024 | 20 | 37.5 | 62.5
OPEN | 1 | ORD00001 | 0012 | 12 | 0024 | 20 | 37.5 | 62.5
因此,我只是try 使用DISTINCT
声明运行,这在大多数情况下都是有效的……但是我的样本数据中有顺序,无论如何都会返回重复的行.
So the question I have是我是否从正确的Angular 来处理这个问题.在同一个表上使用联接是将结果压缩到一行的最佳方式吗?或者,有没有更好的方法来实现这一点?我在某种程度上受到我正在工作的环境的限制:我无法控制提供给我的数据格式,并且我must将结果以单行的形式呈现给执行数据库查询的应用程序.
编辑:一些额外的澄清.对于任何给定的订单,状态、客户、订单号等都是相同的.LoadNbr、Product和Quantity行在每个条目之间是唯一的.因此,一个包含8个产品的订单将有8行,我正在try 将其折叠为单行.