【发布时间】:2021-08-10 13:01:10
【问题描述】:
我有一张表Invoice,看起来类似于:
| order_id | completed_at | subtotal | discount_amount | handling_amount |
|---|---|---|---|---|
| 100 | 07/01/2021 | 10.09 | 0 | 0 |
| 101 | 07/04/2021 | 200.30 | 0 | 0 |
| 102 | 07/04/2021 | 54.10 | 0 | 0 |
| 103 | 07/06/2021 | 12.00 | 0 | 0 |
我还有一张桌子InvoiceDetail:
| order_id | product_id | qty | amount |
|---|---|---|---|
| 100 | 1234 | 1 | 1.09 |
| 100 | Shipping1 | 1 | 4.30 |
| 100 | SalesTax | 1 | .67 |
| 101 | 987 | 2 | 74.20 |
| 101 | 654 | 1 | 6.20 |
| 101 | Shipping2 | 1 | 5.10 |
| 101 | SalesTax | 1 | 2.30 |
| 102 | 123 | 1 | 30.15 |
| 102 | Shipping8 | 1 | 6.80 |
| 102 | SalesTax | 1 | 1.08 |
| 103 | 321 | 1 | 8.04 |
| 103 | Shipping4 | 1 | 2.05 |
| 103 | SalesTax | 1 | .70 |
我需要加入表格,如下所示:
| order_id | completed_at | subtotal | shipping | sales_tax | discount_amount | handling_amount |
|---|---|---|---|---|---|---|
| 100 | 07/01/2021 | 10.09 | 4.30 | .67 | 0 | 0 |
| 101 | 07/04/2021 | 200.30 | 5.10 | 2.30 | 0 | 0 |
| 102 | 07/04/2021 | 54.10 | 6.80 | 1.08 | 0 | 0 |
| 103 | 07/06/2021 | 12.00 | 2.05 | .70 | 0 | 0 |
我尝试了几种不同的方法,但每次都以每个 order_id 多行结束。
SELECT
order_id,
completed_at,
subtotal,
CASE
WHEN t2.product_id LIKE '%Shipping%'
THEN t2.amount
END AS shipping,
CASE
WHEN t2.product_id = 'SalesTax'
THEN t2.amount
END AS sales_tax,
discount_amount,
handling_amount
FROM
Invoice t1
INNER JOIN
InvoiceDetail t2 ON t1.order_id = t2.InvoiceDetail
WHERE
order_id BETWEEN '100' AND '103'
上面将输出信息,但每个order_id 都在多行中。我需要将订单信息与运费和销售税结合在一起。如何实现我的目标?
【问题讨论】:
-
如果可以的话,您可能需要重新考虑您的表架构。如果您将诸如运费和销售税之类的内容转换为单个实际产品的列,我认为您的时间会轻松得多。我希望那些只会有 1 的数量,因此您不仅会使您的查询更加困难,而且您还增加了额外的处理能力来计算您应该存储的值。
-
您可以为每一列执行左连接,或者 PIVOT 是您要查找的关键字
标签: sql sql-server