2013-07-25 1 views
0

우선 모든 답변과 의견을 보내 주셔서 감사합니다. 4 개의 테이블에서 일부 필드를 나열하고 싶습니다. 내 질문은 ODEMELER (고객 지불) 테이블에 BORCLAR (고객 부채) 테이블 값이없는 경우입니다. 즉;Sql Inner Join Dont Have 결과 :

MusteriID은 = 1

이 고객이 제품을 구입합니다. 이 프로세스를 BORCLAR 테이블 (BorcMusteriID = 1)에 삽입하지만 ODEMELER 테이블은이 고객과 OdemeMusteriID = null입니다. 고객이 지불하지 않기 때문에 (null). 그리고 나는이 코드를 모든 고객들로부터 빚을 모두 나열하고 싶습니다.

(SELECT SUM(BORCLAR.BorcTutari) FROM BORCLAR WHERE BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)- 
    (SELECT SUM(ODEMELER.OdemeTutar) FROM ODEMELER where BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)) 
    AS [Borç Toplamı] FROM BORCLAR) 

하지만이 코드는 내게 만 BorcMusteriID이 회신은 다음 고객의 내 많은 항목을 구입하지만 지금은 지불 해달라고 유효한 기록을 OdemeMusteriID. 나는 이것을 목록으로 만들지 않는다. 나는이 코드를 시도하지만 잘못되었다.

((SELECT SUM(BORCLAR.BorcTutari) FROM BORCLAR WHERE 
BORCLAR.BorcMusteriID=ODEMELER.OdemeMusteriID)- 
(SELECT SUM(ODEMELER.OdemeTutar) FROM ODEMELER where 
BORCLAR.BorcMusteriID= 
CASE (SELECT COUNT(*) FROM ODEMELER WHERE 
ODEMELER.OdemeMusteriID=BORCLAR.BorcMusteriID) 
     WHEN 0 THEN ODEMELER.OdemeMusteriID = ODEMELER.OdemeMusteriID 
     ELSE ODEMELER.OdemeMusteriID=0 END)) AS [Borç Toplamı] FROM BORCLAR 

내 코드 완성;

set dateformat dmy 
    SELECT 
    (SELECT TOP 1 BORCLAR.BorcTarih FROM BORCLAR WHERE BORCLAR.BorcTarih <= 
    CONVERT(DATETIME, GETDATE(), 104) 

    and 

    BORCLAR.BorcMusteriID=MUSTERILER.MusteriID order by BORCLAR.BorcTarih desc) 
    as [TARİH], 

    MUSTERILER.Unvan,MUSTERILER.Ad + ' ' + MUSTERILER.Soyad AS [Adı Soyadı], 
    MUSTERILER.Mahalle + 
    ' ' + MUSTERILER.Cadde + ' '+MUSTERILER.Sokak + ' ' + MUSTERILER.ApartmanAdi+ 
    ' NO:' + 
    MUSTERILER.Numara + ' KAT:' + MUSTERILER.Kat + ' DAİRE:'+ 
    MUSTERILER.Daire AS [Adres], 
    ARACSUBETANIMLAR.AracSubeAdi as [Araç/Şube Adı], 

    ((SELECT SUM(BORCLAR.BorcTutari) FROM BORCLAR WHERE BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)- 
    (SELECT SUM(ODEMELER.OdemeTutar) FROM ODEMELER where BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)) 
    AS [Borç Toplamı] FROM BORCLAR 

    INNER JOIN ARACSUBETANIMLAR ON BORCLAR.BorcAracSube = ARACSUBETANIMLAR.AracSubeID 
    INNER JOIN ODEMELER ON BORCLAR.BorcMusteriID = ODEMELER.OdemeMusteriID 
    INNER JOIN MUSTERILER ON BORCLAR.BorcMusteriID = MUSTERILER.MusteriID 

    where 
    BORCLAR.BorcAracSube=ARACSUBETANIMLAR.AracSubeID 
    and 
    ((SELECT SUM(BORCLAR.BorcTutari) FROM BORCLAR WHERE BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)- 
    (SELECT SUM(ODEMELER.OdemeTutar) FROM ODEMELER where BORCLAR.BorcMusteriID= 
    ODEMELER.OdemeMusteriID)>0) 

    group by MUSTERILER.Unvan,MUSTERILER.Soyad,MUSTERILER.Ad, 
    ARACSUBETANIMLAR.AracSubeAdi, 
    ODEMELER.OdemeMusteriID,BORCLAR.BorcMusteriID,MUSTERILER. 
    Cadde,MUSTERILER.Daire, 
    MUSTERILER.ApartmanAdi,MUSTERILER.Mahalle,MUSTERILER.Kat, 
    MUSTERILER.Numara,MUSTERILER.Sokak, 
    MUSTERILER.MusteriID 

고마워요.

+0

LEFT JOIN으로 INNER JOIN을 바꾸시겠습니까? 그런 다음 결과를 확인하십시오. –

+0

LEFT JOIN을 바꾸지 만 결과는 변경되지 않습니다. – EthemX

답변

0

돈을 지불했는지 여부에 관계없이 모든 고객 잔액을 원하는 것처럼 보입니다. 하나의 테이블 (BORCLAR)과 다른 테이블 (ODEMELER)의 구매가 있습니다. 내가 말하는 언어가 확실하지 않지만 "MusteriID"는 고객 ID입니다. CTE를 사용하여 고객이 처음으로 총 구매 및 결제를 한 후 가입 할 수 있습니다. 다음과 같이 입력하십시오 :

;WITH BorclarTotal AS (
    SELECT BORCLAR.BorcMusteriID, SUM(BORCLAR.BorcTutari) AS BorcTutari 
    FROM BORCLAR 
    GROUP BY BORCLAR.BorcMusteriID 
), OdemelerTotal AS (
    SELECT ODEMELER.OdemeMusteriID, SUM(ODEMELER.OdemeTutar) AS OdemeTutar 
    FROM ODEMELER 
    GROUP BY ODEMELER.OdemeMusteriID 
) 
SELECT bt.BorcMusteriID, bt.BorcTutari - ISNULL(ot.OdemeTutar, 0) 
FROM BorclarTotal bt 
     LEFT JOIN OdemelerTotal ot ON bt.BorcMusteriID = ot.OdemeMusteriID 
WHERE bt.BorcTutari != ISNULL(ot.OdemeTutar, 0); 
+0

MusteriID = CustomerID, 죄송합니다.이 글을 쓰는 것을 잊어 버립니다. 나는 (빚 지불)의 합계를 필요로한다. 하지만 고객이 지불하지 않으면 내 코드가 실행됩니다 (부채 - ??!?!?!). 당신의 코드는 ID를 위해 일하고 있습니다. 즉 지금. 어떻게하면 코드를 너무 길게 코드에 통합 할 수 있으며 지불하지 않으면 총 부채가 발생합니다. – EthemX

+0

@EthemX 지불이없는 것은 위의 쿼리에 포함됩니다. 지불이없는 사람 만 * 원할 경우 LEFT JOIN이 일치하지 않는 레코드이므로 WHERE 절에서 "WHERE ot.OdemeMusteriID IS NULL"을 사용하십시오. 마지막 SELECT에서 "bt.BorcTutari - ISNULL (ot.OdemeTutar, 0)"을 추가하여 합계를 봅니다 (전액을 借方 - 크레디트를 포함하도록 수정했습니다). 코드에 쉽게 통합하려면 #temp 테이블에 위의 코드를 삽입 한 다음 후속 쿼리에서 사용하십시오. –

+0

내 코드를 통합하려고 시도했지만 오류가 발생했습니다. 메시지 8120, 수준 16, 상태 1, 줄 3 'BORCLAR.BorcAracSube'열은 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않습니다. – EthemX