1

これは MS SSMS 2016 にあります。SHIPMENT_HEADER と SHIPMENT_DETAIL の 2 つのテーブルがあります。

SHIPMENT_HEADER

shipment_id |  customer  | 
------------|------------|
SH001       |    cust1   |
SH002       |    cust2   |

Shipment_detail には同様の列があります

SHIPMENT_DETAIL

shipment_id | customer | item   | requested_qty|
------------|----------|--------|--------------|
SH001       |   cust1  |  item1 |    2         |
SH001       |   cust1  |  item2 |    2         |
SH001       |   cust1  |  item3 |    1         |
SH002       |   cust2  |  item1 |    2         |
SH002       |   cust2  |  item2 |    2         |

すべてのshipment_idに対して、shipping_headerの詳細を返し、その下にshipping_detailsがリストされているように何かを書くことができるかどうか疑問に思っています。

shipment_id | instruction  |customer | item   | requested_qty|
------------|--------------|---------|--------|--------------|
SH001       |    HEADER    |  cust1  |  NULL  |    5         |
SH001       |    DETAIL    |  cust1  |  item1 |    2         |
SH001       |    DETAIL    |  cust1  |  item2 |    2         |
SH001       |    DETAIL    |  cust1  |  item3 |    1         |
SH002       |    HEADER    |  cust2  |  NULL  |    4         |
SH002       |    DETAIL    |  cust2  |  item1 |    2         |
SH002       |    DETAIL    |  cust2  |  item2 |    2         |

ヘッダーを選択してから詳細を選択する UNION を考えましたが、一度に複数の出荷を照会すると、ヘッダーの詳細、ヘッダーの詳細ではなく、すべてのヘッダーを選択してからすべての詳細を選択します。

これまでのところ、基本的には各ビットを個別に選択するだけです。これは UNION を念頭に置いて書かれているため、別の方法を使用する場合、NULL 列の一部はおそらく不要です。

SELECT
SH.SHIPMENT_ID 'SHIPMENT_ID', 
'HEADER' AS 'INSTRUCTION_TYPE',
SH.CUSTOMER 'CUSTOMER', 
NULL 'ITEM',
B.TOTAL_QTY
FROM SHIPMENT_HEADER SH
    INNER JOIN (
    SELECT SHIPMENT_ID, SUM(REQUESTED_QTY) 'TOTAL_QTY'
    FROM SHIPMENT_DETAIL
    GROUP BY SHIPMENT_ID
    ) AS B
ON SH.SHIPMENT_ID = B.SHIPMENT_ID
WHERE SH.SHIPMENT_ID IN ('SH001','SH002')
UNION
SELECT 
SD.SHIPMENT_ID,
'SHIPMENT_DETAIL' AS 'INSTRUCTION_TYPE',
SD.CUSTOMER,
SD.ITEM,
SD.REQUESTED_QTY
FROM SHIPMENT_DETAIL SD
WHERE SD.SHIPMENT_ID IN (
'SH001', 'SH002'
)
ORDER BY 1, 2
4

2 に答える 2