2017-08-10 45 views
0

我在寫一個sql查詢來顯示所有發票。發票有多個產品。我使用INNER JOIN從多個表中進行選擇。我得到的結果是:SQL查詢選擇同一發票中的多個產品

INV No. Client  Product  Total 
--------------------------------------------- 
inv1 client name1  product1  100.00 
inv1 client name1  product2  100.00 
inv1 client name1  product3  100.00 
inv2 client name2  product1  150.00 
inv2 client name2  product3  150.00 

是否有可能顯示的結果是這樣的:

INV No. Client  Product  Total 
--------------------------------------------- 
inv1 client name1  product1  100.00 
         product2  
         product3  
inv2 client name2  product1  150.00 
         product3  

我使用此查詢報告的目的。

回答

1

這是可能的。這種審美工作通常應該在應用層完成。問題在於結果取決於排序 - 而SQL表和結果集通常是無序的。

但是,你可以使用窗口函數做到這一點:

select (case when row_number() over (partition by inv_no order by product) = 1 
      then inv_no 
     end) as inv_no, 
     (case when row_number() over (partition by inv_no order by product) = 1 
      then client 
     end) as client, 
     product, 
     (case when row_number() over (partition by inv_no order by product) = 1 
      then total 
     end) as total 
from t 
order by inv_no, product; 

注意,最外面的查詢具有完全匹配的partition byorder by子句row_number()order by

+0

太棒了!工作..非常感謝你。它在單元格中顯示NULL,我們可以顯示它爲空(「」)? – User27

+0

@ User27。 。 。您可以將'else'''添加到字符串列中。如果有些是數字,那麼你將需要將數字格式化爲一個字符串(比如使用'str()'),然後使用'else'''。 –