En iyi yanıtlayıcılar
çoklu tablo birleştirme

Soru
-
Merhaba arkadaşlar beni iki gündür sıkıntıya sokan bir problemim var. elimde hedef ve gerçekleşen adında iki tablom var. bu tabloları tek tek çektiğim zaman doğru sonuca ulaşırken inner join ile birleştirdiğimde saçma sapan bir sonuca ulaşmaktayım bu konuda bana yardım ederseniz çok sevinirim. mssql 2012 kullanıyorum.
Hedef Tablo
Birleşim tablo
Yanıtlar
-
WITH OrdersTotal ( EmployeeCode, DonemAdi, DonemAyAdi, DirektorAdi, BolgeAdi, totalcount, Gerceklesen1, GPerceklesen2 ) AS ( SELECT Employees.EmployeeCode, Donem.DonemAdi, DonemA.DonemAyAdi, DIREKTOR.DirektorAdi, BOLGE.BolgeAdi, COUNT(orders.OrderID) AS totalcount, SUM(CASE WHEN [Orders].[IslemTuruID] IN ( 1, 2, 3, 4 ) THEN [Orders].[Adet] ELSE 0 END) AS Gerceklesen1, SUM(CASE WHEN [Orders].[IslemTuruID] IN ( 5, 6, 7 ) THEN [Orders].[Adet] ELSE 0 END) AS GPerceklesen2 FROM dbo.Employees AS Employees INNER JOIN dbo.Orders AS Orders ON Employees.EmployeeID = Orders.EmployeeID INNER JOIN dbo.DonemYil AS Donem ON Orders.DonemID = Donem.DonemID INNER JOIN dbo.DonemAy AS DonemA ON Orders.DonemAyID = DonemA.DonemAyID INNER JOIN dbo.Tdm AS TDM ON Orders.TdmID = TDM.TdmID INNER JOIN dbo.Bolge AS BOLGE ON TDM.BolgeID = BOLGE.BolgeID INNER JOIN dbo.Direktor AS DIREKTOR ON TDM.DirektorID = DIREKTOR.DirektorID GROUP BY Donem.DonemAdi, DonemA.DonemAyAdi, BOLGE.BolgeAdi, DIREKTOR.DirektorAdi, Employees.EmployeeCode ), hedef ( EmployeeCode, Hedef1, Hedef2 ) AS ( SELECT Employees.EmployeeCode, SUM(CASE WHEN HedefTanim.IslemTuruID = 8 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef1, SUM(CASE WHEN HedefTanim.IslemTuruID = 9 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef2 FROM dbo.Employees AS Employees INNER JOIN dbo.HedefTanim AS HedefTanim ON Employees.EmployeeID = HedefTanim.EmployeeID GROUP BY Employees.EmployeeCode ) SELECT [OrdersTotal].*, Hedef1, Hedef2 FROM [OrdersTotal] INNER JOIN [hedef] ON [OrdersTotal].[EmployeeCode] = [hedef].[EmployeeCode]
- Yanıt Olarak İşaretleyen Turk165 9 Şubat 2015 Pazartesi 22:47
Tüm Yanıtlar
-
Aşağıdan kontrol edebilirsin yaptığın işlemleri
http://www.yazilimmutfagi.com/10118/veritabani/sql-server/join-islemi-inner-join.aspx
Bu ileti veya öneriler size yardımcı olduysa "Yanıt olarak işaretle" linkine tıklayınız.
-
Yaptigin joinlerin herhangi birisi many-to-many sonuca neden oluyorsa, asla boyle durumlarda sum() gibi aggregate fonksiyonlarini kullanma, sonuc hatali cikar.
Ornek:
satiselemani, bolgesi
-------------- -------
Ali Ankara
Veli Ankara
Ahmet IzmirsatisTutari, dukkanId
----------- ----------
100 1
200 2dukkanId, bolgesi
---------- --------
1 Ankara
2 IzmirBunu:
select * from ...
diye birlestirirsek:
Ali Ankara 100 1 1 Ankara Veli Ankara 100 1 1 Ankara Ahmet Izmir 200 2 2 Izmir
sonucu cikacak. sum(satisTutari) ise hatali sonuc verecek.
Bu durumu cozmek icin subquerde once sum isini yap.
Not: Sana ornek olarak senin kodlarinda bu duzeltmeyi yapamiyorum cunku kod vermek dururken resim koymussun :(
-
Öncelikle ilgilendiğiniz için teşekkür ederim. Ama şöyle bir durum var;
Ornek:
satiselemani, bolgesi
-------------- -------
Ali Ankara
Veli Ankara
Ahmet IzmirsatisTutari, dukkanId
----------- ----------
100 1
200 2dukkanId, bolgesi
---------- --------
1 Ankara
2 Izmirsatiselemani, Hedefi
-------------- -------
Ali 100
Veli 300
Ahmet 250Bu fonkisiyonun içine hedef de dahil olunca saçmalıyor. İkinci tabloda belirttiğim gibi. ilk tabloda herşey normal sum() fonksiyonunda bir sorun yok ama hedefi araya kattığım zaman herşey başka bir hal alıyor.
-
-
Bu tablo toplam dönem içinde yapılan satış
SELECT Employees.EmployeeCode, Donem.DonemAdi, DonemA.DonemAyAdi, DIREKTOR.DirektorAdi,BOLGE.BolgeAdi, count(orders.OrderID) as totalcount,
(SUM(CASE WHEN [Orders].[IslemTuruID] = 1 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 2 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 3 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 4 THEN [Orders].[Adet] ELSE 0 END)) AS Gerceklesen1,
(SUM(CASE WHEN [Orders].[IslemTuruID] = 5 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 6 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 7 THEN [Orders].[Adet] ELSE 0 END)) AS GPerceklesen2
FROM dbo.Employees AS Employees
INNER JOIN
dbo.Orders AS Orders ON Employees.EmployeeID=Orders.EmployeeID
INNER JOIN
dbo.DonemYil AS Donem ON Orders.DonemID = Donem.DonemID
INNER JOIN
dbo.DonemAy AS DonemA ON Orders.DonemAyID = DonemA.DonemAyID
INNER JOIN
dbo.Tdm AS TDM ON Orders.TdmID = TDM.TdmID
INNER JOIN
dbo.Bolge AS BOLGE ON TDM.BolgeID = BOLGE.BolgeID
INNER JOIN
dbo.Direktor AS DIREKTOR ON TDM.DirektorID = DIREKTOR.DirektorID
GROUP BY Donem.DonemAdi, DonemA.DonemAyAdi, BOLGE.BolgeAdi, DIREKTOR.DirektorAdi,Employees.EmployeeCode
Aşağıda ki tablo da taplam hedefle birleştirlmiş hali
SELECT Employees.EmployeeCode, Donem.DonemAdi, DonemA.DonemAyAdi, DIREKTOR.DirektorAdi,BOLGE.BolgeAdi, count(orders.OrderID) as totalcount,
INNER JOIN
(SUM(CASE WHEN [Orders].[IslemTuruID] = 1 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 2 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 3 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 4 THEN [Orders].[Adet] ELSE 0 END)) AS Gerceklesen1,
SUM(CASE WHEN HedefTanim.IslemTuruID = 8 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef1,
(SUM(CASE WHEN [Orders].[IslemTuruID] = 5 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 6 THEN [Orders].[Adet] ELSE 0 END)+
SUM(CASE WHEN [Orders].[IslemTuruID] = 7 THEN [Orders].[Adet] ELSE 0 END)) AS GPerceklesen2
SUM(CASE WHEN HedefTanim.IslemTuruID = 9 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef2
FROM dbo.Employees AS Employees
INNER JOIN
dbo.Orders AS Orders ON Employees.EmployeeID=Orders.EmployeeID
dbo.HedefTanim AS HedefTanim ON Employees.EmployeeID=HedefTanim.EmployeeIDINNER JOIN
dbo.DonemYil AS Donem ON Orders.DonemID = Donem.DonemID AND HedefTanim.DonemID=Donem.DonemID
INNER JOIN
dbo.DonemAy AS DonemA ON Orders.DonemAyID = DonemA.DonemAyID AND HedefTanim.DonemAyID=DonemAy.DonemAyIDINNER JOIN
dbo.Tdm AS TDM ON Orders.TdmID = TDM.TdmID
INNER JOIN
dbo.Bolge AS BOLGE ON TDM.BolgeID = BOLGE.BolgeID
INNER JOIN
dbo.Direktor AS DIREKTOR ON TDM.DirektorID = DIREKTOR.DirektorID
GROUP BY Donem.DonemAdi, DonemA.DonemAyAdi, BOLGE.BolgeAdi, DIREKTOR.DirektorAdi,Employees.EmployeeCode -
WITH OrdersTotal ( EmployeeCode, DonemAdi, DonemAyAdi, DirektorAdi, BolgeAdi, totalcount, Gerceklesen1, GPerceklesen2 ) AS ( SELECT Employees.EmployeeCode, Donem.DonemAdi, DonemA.DonemAyAdi, DIREKTOR.DirektorAdi, BOLGE.BolgeAdi, COUNT(orders.OrderID) AS totalcount, SUM(CASE WHEN [Orders].[IslemTuruID] IN ( 1, 2, 3, 4 ) THEN [Orders].[Adet] ELSE 0 END) AS Gerceklesen1, SUM(CASE WHEN [Orders].[IslemTuruID] IN ( 5, 6, 7 ) THEN [Orders].[Adet] ELSE 0 END) AS GPerceklesen2 FROM dbo.Employees AS Employees INNER JOIN dbo.Orders AS Orders ON Employees.EmployeeID = Orders.EmployeeID INNER JOIN dbo.DonemYil AS Donem ON Orders.DonemID = Donem.DonemID INNER JOIN dbo.DonemAy AS DonemA ON Orders.DonemAyID = DonemA.DonemAyID INNER JOIN dbo.Tdm AS TDM ON Orders.TdmID = TDM.TdmID INNER JOIN dbo.Bolge AS BOLGE ON TDM.BolgeID = BOLGE.BolgeID INNER JOIN dbo.Direktor AS DIREKTOR ON TDM.DirektorID = DIREKTOR.DirektorID GROUP BY Donem.DonemAdi, DonemA.DonemAyAdi, BOLGE.BolgeAdi, DIREKTOR.DirektorAdi, Employees.EmployeeCode ), hedef ( EmployeeCode, Hedef1, Hedef2 ) AS ( SELECT Employees.EmployeeCode, SUM(CASE WHEN HedefTanim.IslemTuruID = 8 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef1, SUM(CASE WHEN HedefTanim.IslemTuruID = 9 THEN HedefTanim.HedefTanimla ELSE 0 END) AS Hedef2 FROM dbo.Employees AS Employees INNER JOIN dbo.HedefTanim AS HedefTanim ON Employees.EmployeeID = HedefTanim.EmployeeID GROUP BY Employees.EmployeeCode ) SELECT [OrdersTotal].*, Hedef1, Hedef2 FROM [OrdersTotal] INNER JOIN [hedef] ON [OrdersTotal].[EmployeeCode] = [hedef].[EmployeeCode]
- Yanıt Olarak İşaretleyen Turk165 9 Şubat 2015 Pazartesi 22:47
-