2017-04-25 70 views
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,它返回shipment_header細節,與shipment_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 

回答

1

您可以使用下面的語句:

(
SELECT header.shipment_id, 'HEADER' as 'instruction', header.customer, NULL as 'item', SUM(requested_qty) as 'requested_qty' 
FROM SHIPMENT_HEADER header 
LEFT JOIN SHIPMENT_DETAIL detail 
ON header.shipment_id = detail.shipment_id 
AND header.customer = detail.customer 
GROUP BY header.shipment_id, header.customer 
) 
UNION 
(
SELECT shipment_id, 'DETAIL', customer, item, requested_qty 
FROM SHIPMENT_DETAIL 
) 
ORDER BY 1, 2 DESC, 3, 4 

它得出以下結果

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 
+0

啊哈!謝謝,我通過使用不同的順序,設法得到我需要的。令人尷尬的簡單...非常感謝! – Smeghead

1

試試這個。在這裏,我假設對於shipment_id,你有相同的customer,根據你的例子。如果不是這種情況,你必須告訴,你想用HEADER記錄顯示哪個customer

編輯:使用CTE僅考慮SHIPMENT_HEADERSHIPMENT_DETAIL兩者中的記錄。

with t_SHIPMENT_DETAIL as 
(SELECT d.shipment_id, 
       d.customer, 
       d.item, 
       d.requested_qty 
     FROM SHIPMENT_DETAIL d 
     inner join 
     SHIPMENT_HEADER h 
     on d.shipment_id=h.shipment_id 
) 
SELECT * 
FROM 
    (SELECT shipment_id, 
      'HEADER' AS instruction, 
      customer, 
      NULL AS item, 
      sum(requested_qty) AS requested_qty 
    FROM t_SHIPMENT_DETAIL 
    GROUP BY shipment_id, 
      customer 

    UNION ALL 

    SELECT shipment_id, 
      'DETAIL' AS instruction, 
      customer, 
      item, 
      requested_qty 
    FROM t_SHIPMENT_DETAIL 
    ) 
ORDER BY shipment_id, 
     instruction DESC 

說明:工會首先查詢由shipment_id, customer獲得sum(requested_qty)組。我們在這裏硬編碼HEADERnull。現在,工會的第二部分是您當前的查詢貨件詳細信息,除了額外的列DETAIL。它與UNION

中的列匹配。最後,將其封裝在order by的select子句中。

+0

這個查詢允許你提取未插入SHIPMENT_HEADER表頭。似乎有點不對。 – Hybris95

+0

糾正了相同的情況。 – Utsav

相關問題