none
çoklu tablo birleştirme RRS feed

  • 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

    7 Şubat 2015 Cumartesi 21:22

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
    9 Şubat 2015 Pazartesi 22:33

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.

    8 Şubat 2015 Pazar 13:54
  • 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           Izmir

    satisTutari, dukkanId
    -----------  ----------
    100           1
    200           2

    dukkanId, bolgesi
    ---------- --------
    1             Ankara
    2             Izmir

    Bunu:

    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 :(

    8 Şubat 2015 Pazar 15:36
  • Öncelikle ilgilendiğiniz için teşekkür ederim. Ama şöyle bir durum var;

    Ornek:

    satiselemani, bolgesi
    -------------- -------
    Ali                 Ankara
    Veli               Ankara
    Ahmet           Izmir

    satisTutari, dukkanId
    -----------  ----------
    100           1
    200           2

    dukkanId, bolgesi
    ---------- --------
    1             Ankara
    2             Izmir

    satiselemani, Hedefi
    -------------- -------
    Ali                 100
    Veli               300
    Ahmet           250

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

    9 Şubat 2015 Pazartesi 08:25
  • Sanirim soylediklerimi anlamadin :( Kodunu verirsen yardimci olmaya calisayim.
    9 Şubat 2015 Pazartesi 16:18
  • 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,

    (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

    INNER JOIN
    dbo.HedefTanim AS HedefTanim ON Employees.EmployeeID=HedefTanim.EmployeeID

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

          
    9 Şubat 2015 Pazartesi 19:35
  • 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
    9 Şubat 2015 Pazartesi 22:33
  • Olay budur nerelerde hata yaptığımı çok çok iyi anladım. Çok iyi bir ders oldu bana. Gerçekten yardımlarınız için çok çok teşekkür ederim.
    9 Şubat 2015 Pazartesi 22:50