2013-10-09 4 views
0

У меня очень трудное время, пытаясь получить мой результат, чтобы показать, что они мне нужны, чтобы отобразить ... вот и пример того, что мой запрос выглядит так, и ниже будет результат, который мне нужен ...
iv был на этом долгое время пробовал заявления о делах и объединениях, но не повезло, если кто-нибудь может помочь, я бы очень признателен.SQL Возвращает разные значения в одной и той же строке на основе значения, которое находится в той же таблице

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  

и спасибо вам, если кто-нибудь может мне помочь

+0

, пожалуйста, введите код в блоках кода, чтобы люди могли легко его прочитать. – johnny

+0

Как отличить дебиты от кредитов? Положительная транзакция = Кредит, Отрицательная транзакция = Дебет? – Matt

+0

Да, извините, первый раз. пытаясь использовать все. но положительная транзакция = дебет и отрицательная транзакция = кредит снова жаль – test

ответ

0

во-первых, использовать КТР отделить кредиты и дебеты в отдельные наборы данных, то полное объединение их в зависимости от PTNO, CD и обратное значение (* -1) от AMT.

Редактировать: Поскольку соединение на основе 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 
+0

В столбце BatchNo и BatchSeqID столбец, которые уникальны для каждой транзакции, я бы просто добавил, что к верхним операторам выбора, чтобы предотвратить дублирование? – test

+0

Является ли BatchNo уникальным для дебетовых/кредитных пар и BatchSeqID уникальным для каждого кредита или дебетования? – Matt

+0

BatchNo не уникален для дебетовых/кредитных пар. Batchseqid уникален для каждого кредита и дебетования, который никогда не бывает таким же для любой транзакции. – test

0

, если вам не нравится решение Мэтта и риск дублированных строк, вы можете иметь каждую сделку по другой строке:

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 

Here вы можете увидеть и играть Wiht результат.

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 
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 here.

+0

SQLFilddle довольно круто спасибо – test

Смежные вопросы