2013-07-25 4 views
0

Прежде всего, спасибо большое всем ответам и комментариям. Я хочу перечислить некоторые поля из 4 таблиц. Мой вопрос заключается в том, что таблицы ODEMELER (Customer Payments) не имеют значения таблиц BORCLAR (Customer Debt). А именно,Sql Inner Join Dont Have Result

MusteriID является = 1.

Этого клиента купить товар. Я вставляю этот процесс в таблицу BORCLAR (BorcMusteriID = 1), но таблица ODEMELER для этого клиента равна null, а OdemeMusteriID = !!! (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

Можете ли вы попробовать, заменив INNER JOIN LEFT JOIN? Затем проверьте результат. –

+0

Я заменяю LEFT JOIN, но результат не меняется. – EthemX

ответ

0

Похоже, вы хотите, чтобы все остатки клиентов были независимо от того, заплатили они или нет. У вас есть покупки в одной таблице (BORCLAR) и платежи в другой таблице (ODEMELER). Я не уверен, на каком языке вы говорите, но я думаю, что «MusteriID» - это идентификатор клиента. Вы можете использовать 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

Я пытаюсь интегрировать мой код для этого, но с ошибкой; Msg 8120, уровень 16, состояние 1, строка 3 Столбец «BORCLAR.BorcAracSube» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. – EthemX