0

我很难让我的结果显示他们我需要他们显示......这里和我的查询看起来像的例子,下面将是我需要的结果......我
一直在这个长时间尝试案例陈述和加入但没有运气,如果有人可以提供帮助,我将非常感激。

table name dbo.DTLPAYMENTS 

columns   
PTNO    
CD   
AMT   
DESCRIPTION

我的查询将我的结果显示给我,就像这样......而且贷方和借方从来没有相等的金额行。所以一个人的借方(>0)可以多于贷方(<0),反之亦然....

PTNO       /  CD    / AMT   / DESCRIPTION    
10007558931 30073   688.82    PAYMENT-ME    
10007558931 30073   -704.44   PAYMENT-ME    
10007558931 30073   704.44    PAYMENT-ME    
10007558931 30073   -688.82   PAYMENT-ME    
10007558931 30073   -698.82   PAYMENT-ME

如果有任何可能的话,我需要将借方和贷方放在不同的列中
,我可以像这样将结果返回给我...

PTNO /      CD /    AMT /   DESCRIPTION / CD /     AMT / DESCRIPTION    
10007558931 30073   688.82  PAYMENT-ME    30073   -688.82  PAYMENT-ME   
10007558931 30073   704.44  PAYMENT-ME    30073   -698.82  PAYMENT-ME   
10007558931                               30073   -704.44  PAYMENT-ME      

如果有人可以帮助我,谢谢你

4

3 回答 3

0

首先,使用 CTE 将 Credits 和 Debits 分成单独的数据集,然后根据 PTNO、CD 和 AMT 的反值 (* -1) 将它们 FULL JOIN。

编辑:由于基于 AMT 的加入不是目标,我使用 BatchSeqID 作为按时间顺序对数据进行排序的方法。使用 ROW_NUMBER() 对两个数据集进行排序,然后我加入了这个值。

;WITH
Credit AS
(   SELECT PTNO,CD,AMT,DESCRIPTION,
    ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort
    FROM dbo.DTLPAYMENTS
    WHERE AMT < 0 ),
Debit AS
(   SELECT PTNO,CD,AMT,DESCRIPTION,
    ROW_NUMBER()OVER(PARTITION BY PTNO,CD ORDER BY BatchSeqID) AS Sort
    FROM dbo.DTLPAYMENTS
    WHERE AMT > 0 )

SELECT  ISNULL(c.PTNO,d.PTNO) AS PTNO,
        ISNULL(c.CD,d.CD) AS CD,
        --Credit data
        c.AMT AS CRAMT,
        c.DESCRIPTION AS CRDESCRIPTION,
        --Debit data
        d.AMT AS DBTAMT,
        d.DESCRIPTION AS DBTDESCRIPTION
FROM Credit c
FULL JOIN Debit d 
    ON d.PTNO = c.PTNO
    AND d.CD = c.CD
    AND d.Sort= c.Sort
于 2013-10-09T17:15:02.393 回答
0

假设您要按列的大小对输出进行排序amt,请尝试:

select ptno,
       max(case sign(amt) when 1 then cd end) dr_cd,
       max(case sign(amt) when 1 then amt end) dr_amt,
       max(case sign(amt) when 1 then description end) dr_desc,
       max(case sign(amt) when -1 then cd end) cr_cd,
       max(case sign(amt) when -1 then amt end) cr_amt,
       max(case sign(amt) when -1 then description end) cr_desc
from (select d.*, 
             row_number() over (partition by ptno, cd, sign(amt) 
                                order by abs(amt)) rn
      from DTLPAYMENTS d) sq
group by ptno, cd, rn
order by ptno, cd, rn

SQLFiddle在这里

于 2013-10-09T17:44:56.127 回答
0

如果您不喜欢 Matt 的解决方案和重复行的风险,您可以将每个事务放在不同的行上:

SELECT PTNO,
       CASE WHEN AMT < 0 THEN cd ELSE null END DBTCD,
       CASE WHEN AMT < 0 THEN amt ELSE null END AMTCD,
       CASE WHEN AMT < 0 THEN DESCRIPTION ELSE null END DBTDESCRIPTION,
       CASE WHEN AMT > 0 THEN cd ELSE null END CRCD,
       CASE WHEN AMT > 0 THEN amt ELSE null END CRAMT,
       CASE WHEN AMT > 0 THEN DESCRIPTION ELSE null END CRDESCRIPTION
FROM TABLE1
order by PTNO, AMT

在这里,您可以查看和播放结果。

 PTNO           DBTCD   AMTCD   DBTDESCRIPTION  CRCD    CRAMT   CRDESCRIPTION
 10007558931    30073   -704    PAYMENT-ME      (null)  (null)  (null)
 10007558931    30073   -699    PAYMENT-ME      (null)  (null)  (null)
 10007558931    30073   -689    PAYMENT-ME      (null)  (null)  (null)
 10007558931    (null)  (null)  (null)          30073   689     PAYMENT-ME
 10007558931    (null)  (null)  (null)          30073   704     PAYMENT-ME
于 2013-10-09T17:30:56.190 回答