2017-08-10 66 views
1

逆转置我有两个表:加入并在多个表

校正表:

C_CORRECTIONS 
CorrAmount |HalfYear1 |HalfYear2 |Type |REFNUM | 
----------------------------------------------------- 
1000  |50   |50   |HYINT |R123 | 

整理表:

P_COLLECTED 
Amount  |Type |Account |REFNUM | 
----------------------------------------- 
1500  |TOTAL |ACCT1  |R123 | 
50   |HYINT |ACCT2  |R123 | 
50   |HYINT |ACCT3  |R123 | 

我需要的是:

CorrAmount |Type |Account |REFNUM | 
----------------------------------------- 
1000  |TOTAL |ACCT1  |R123 | 
50   |HYINT |ACCT2  |R123 | 
50   |HYINT |ACCT3  |R123 | 

我试过了如下:

SELECT DISTINCT C.AMT, P.ACCOUNT,C.REFNUM FROM (
SELECT U.AMT, U.Type, REFNUM 
FROM C_CORRECTIONS 
UNPIVOT 
(
    AMT 
    FOR INT_AMT IN (CorrAmount,HalfYear1,HalfYear2) 
) U 
) C 
LEFT JOIN P_COLLECTED P 
ON C.REFNUM = P.REFNUM AND C.AMT = P.Amount; 

结果:

AMT  |ACCOUNT |REFNUM | 
--------|-----------|-------| 
50  |ACCT2  |R123 | 
50  |ACCT3  |R123 | 
1000 |   |R123 | 

编辑:好的。所以我使用了左连接而不是连接,并将其放在不同的位置,并且我获得了主金额,但我似乎无法为其获取帐户。

回答

1

您unpivot的C_CORRECTIONS然后再加入P_COLLECTED它。

但也许你可以从P_COLLECTED开始并将C_CORRECTIONS加入它。
由于P_COLLECTED已经有多行。

测试例如:

declare @P_COLLECTED table (Amount int, Type varchar(8), Account varchar(8), REFNUM varchar(8)); 
declare @C_CORRECTIONS table (CorrAmount int, HalfYear1 int, HalfYear2 int, Type varchar(8), REFNUM varchar(8)); 

insert into @P_COLLECTED (Amount, Type, Account, REFNUM) values 
(1500,'TOTAL','ACCT1','R123'), 
(50 ,'HYINT','ACCT2','R123'), 
(50 ,'HYINT','ACCT3','R123'); 

insert into @C_CORRECTIONS (CorrAmount, HalfYear1, HalfYear2, Type, REFNUM) values 
(1000,24,26,'HYINT','R123'); 

select 
(case when t.Type = 'TOTAL' then c.CorrAmount else t.Amount end) as Amount, 
t.Type, t.Account, t.REFNUM 
-- , c.* 
from @P_COLLECTED t 
left join @C_CORRECTIONS c 
     -- on (t.REFNUM = c.REFNUM and t.Type in ('TOTAL',c.Type)); 
     on (t.REFNUM = c.REFNUM and t.Type = 'TOTAL'); 
+0

完美的作品!谢谢..另外,实际的查询非常复杂,并且有5个巨大表格的连接。有没有别的办法?减少案例功能花费的时间。 – Anu

+0

@Anu CASE在行级别工作,所以不影响查询计划,所以不需要更多时间。如果REFNUM是C_CORRECTIONS中的首选键,那么额外的左连接不应使复杂查询变慢。但是也许你注意到这个查询也加入了c.Type的t.Type。如果您只需要更正总金额,则可以将其简化为ON(t.REFNUM = c.REFNUM和t.Type ='TOTAL')'。 – LukStorms

+0

谢谢..只是实现了即使HalfYear1和HalfYear2将被改变(在这种情况下50到25)..我将需要修正表作为基地.. – Anu

0

您好我在你的剧本已经修改请核实

Select Amount, 
     Type, 
     'Acct' + CAST(ROW_NUMBER()OVER(PARTITION BY Refnum ORDER BY (Select NULL))AS VARCHAR(20))Account,REFNUM 
       from 
      (Select Amount, Type, REFNUM from @Table2 where type = 'Total' 
        UNION ALL 
      SELECT C.AMT, C.Type,C.REFNUM FROM (
      SELECT U.AMT, U.Type, REFNUM 
      FROM @Table1 
      UNPIVOT 
      (
       AMT 
       FOR INT_AMT IN (CorrAmount,HalfYear1,HalfYear2) 
      ) U 
      ) C,@Table2 P 
      WHERE C.REFNUM = P.REFNUM OR C.AMT = P.Amount 
      GROUP BY C.AMT, C.Type,C.REFNUM)T