2016-06-08 92 views
2

我想要在sql查询中连接2个表时然后在结果中 重复的列单元格其中一个重复条目变为null。 我的第一个表是:SQl查询加入并将重复列值设置为null

id corp_code pay_authority_no authority_price status 
1 C286   210995    85020000 True 
2 C286   210879    61040000 True 
3 C139   212475    77708280 True 
4 C139   212465    77878320 True 
5 C296   216177    101335000 True 
13 C321   214526    56680000 True 

和第二表是:

id pay_authority_no order_kind order_no 
2   210879   Reorder 84182 
1   210995   Reorder 83251 
4   212465   Sup  459950 
3   212475   Sup  459948 
15  212475   Sup  65878 
13  214526   Reorder 86019 
14  214526   Reorder 86020 
5   216177   Reorder 83715 

而且结果是:

corp_code pay_authority_no authority_price order_no order_kind 
    C139   212465   77878320  459950  Sup 
    C139   212475   77708280  459948  Sup 
    C139   212475   77708280  65878  Sup 
    C286   210879   61040000  84182  Reorder 
    C286   210995   85020000  83251  Reorder 
    C296   216177   101335000  83715  Reorder 
    C321   214526   56680000  86019  Reorder 
    C321   214526   56680000  86020  Reorder 

我想结果是这样的:

corp_code pay_authority_no authority_price order_no order_kind 
    C139   212465   77878320   459950  Sup 
    C139   212475   77708280   459948  Sup 
    C139   212475   Null or 0  65878  Sup 
    C286   210879   61040000   84182  Reorder 
    C286   210995   85020000   83251  Reorder 
    C296   216177   101335000  83715  Reorder 
    C321   214526   56680000   86019  Reorder 
    C321   214526   Null or 0  86020  Reorder 

请解决此问题!

+2

总是标记sql服务器的版本 – FLICKER

+2

您可以使用'ROW_NUMBER()OVER(PARTITION BY authority_price ORDER BY任何...)'然后CASE语句,如'CASE WHEN RN = 1 THEN authority_price END'而不是选择authority_price。 – ZLK

+0

我想要这个结果用于stimulreports.net,但是当stimulsoft reports.net设计器处理重复集合时,总和不成立。由于这个原因,必须总结为零重复正确计算总金额 –

回答

4

试试这个:

SELECT t1.corp_code, t1.pay_authority_no, 
     CASE 
      WHEN t2.rn = 1 THEN t1.authority_price 
      ELSE NULL 
     END authority_price, 
     t2.order_no, t2.order_kind 
FROM tab1 AS t1 
JOIN (
    SELECT order_kind, order_no, pay_authority_no, 
      ROW_NUMBER() OVER (PARTITION BY pay_authority_no ORDER BY id) AS rn 
    FROM tab2 
) AS t2 ON t1.pay_authority_no = t2.pay_authority_no 
ORDER BY t1.corp_code,t1.pay_authority_no 
+0

非常感谢你giorgos-betsoss –

1

你可以尝试这样的事情,

;WITH cte AS(
       SELECT t1.corp_code,t1.pay_authority_no,t1.authority_price, 
         t2.order_no,t2.order_kind,ROW_NUMBER() OVER(PARTITION BY authority_price ORDER BY corp_code) ROWN 
       FROM tab1 t1 
         INNER JOIN tab2 t2 ON t2.pay_authority_no = t1.pay_authority_no) 

SELECT corp_code,pay_authority_no, 
     CASE 
      WHEN ROWN = 1 THEN authority_price 
      ELSE NULL 
     END authority_price, 
     order_no,order_kind 
FROM cte 
ORDER BY corp_code,pay_authority_no 

Live Demo

+0

非常感谢@pedram –

-1

使用标准化 这个技术去除重复条目的数据库