2017-08-10 52 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'''。 –