簡體   English   中英

SQL基於同一表中的值在同一行上返回不同的值

[英]SQL Return different values on the same row, based on a value thats in the same table

我在嘗試獲取我的結果以顯示他們需要它們來顯示時遇到了非常困難的時間...這里和我的查詢看起來像的示例,下面將是我需要的結果...
iv一直在嘗試案例陳述和加入,但沒有運氣,如果有人可以幫助的話,我將非常感激。

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      

如果有人能幫助我,謝謝你

首先,使用CTE將貸方和借方分離為單獨的數據集,然后根據PTNO,CD和AMT的反值(* -1)進行完全聯接。

編輯:由於基於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

如果您不喜歡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

假設您要根據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 在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM