none
SQL SERVER JOIN OLAYI RRS feed

  • Soru

  • Merhaba arkadaşlar üstesinden uzun zamandır gelemediğim bir problemim var. Ve biliyorum çözümü de aslında çok basit ama ben bilmiyorum ve bulamıyorum..

    İki Adet Tablom Var:

    A Tablosu:

    IsciID

    IsinZamani

    IsID

    1

    1.2000

    1

    2

    1.4000

    2

    3

    1.0000

    2

    B Tablosu

    IsID

    IsinAdi

    Status

    1

    Örnek İş

    Aktif

    2

    Örnek İş 2

    Aktif

    2 Adet Tablomuz Var.

    Bir tanesi o işte çalışan işçilerin ne kadar çalıştığını tutan birinde de iş kayıtlarını tutan iki tablo var. Ben rapor çıkarmak istiyorum. Öyleki;

                    
    SELECT b.*,a.IsinZamani FROM TABLOB as b
    		left outer join TABLOA as a on a.IsID=b.IsID
    		WHERE b.Status='Aktif'

    Yaptığımda 3 sonuç döndürüyor.

    IsID

    IsinAdi

    Status

    IsinZamani

    1

    Örnek İş

    Aktif

    1.2000

    2

    Örnek İş 2

    Aktif

    1.4000

    3

    Örnek İş 2

    Aktif

    1.0000

    Aynı işin yinelenmemesi lazım. Ben şunu istiyorum. Örneğin iş id is 1 olan işte zaten bir kişi çalışmış ve problem olmuyor. Ama 2 işçinin çalıştığı 2 numaralı iş tek kayıtta gelsin ve işinZamanı kısımları toplansın. Yani istediğim tablo aşağıda. 3 tane işçi o işte çalışmış olsa o 3taneyi toplayıp yazması lazım.. Umarım anlatabildim. Yardımcı olursanız sevinirim.

    IsID

    IsinAdi

    Status

    IsinZamani

    1

    Örnek İş

    Aktif

    1.2000

    2

    Örnek İş 2

    Aktif

    2.4000


    19 Aralık 2014 Cuma 08:47

Yanıtlar

  • Sql de group by diye bir komut var istediğimiz verilieri gruplayıp o verilerin istediğimiz alanlarını toplayabiliriz. Yani:

    SELECT b.IsId, b.IsinAdi, b.Status, Sum(a.IsinZamani) as Zaman
    FROM TABLOB as b
         left Outer Join TABLOA as a On a.IsID=b.IsID
    WHERE b.Status='Aktif'
    Group By b.IsId, b.IsinAdi, b.Status
    Not İş adlarının tekrarlayabilme ihtimalinden dolayı IsId yide select sorgusuna ve group a eklenmelidir.

    • Düzenleyen Berdann 19 Aralık 2014 Cuma 09:11
    • Yanıt Olarak İşaretleyen Emre Bnzr 19 Aralık 2014 Cuma 12:09
    19 Aralık 2014 Cuma 09:00

Tüm Yanıtlar

  • Sql de group by diye bir komut var istediğimiz verilieri gruplayıp o verilerin istediğimiz alanlarını toplayabiliriz. Yani:

    SELECT b.IsId, b.IsinAdi, b.Status, Sum(a.IsinZamani) as Zaman
    FROM TABLOB as b
         left Outer Join TABLOA as a On a.IsID=b.IsID
    WHERE b.Status='Aktif'
    Group By b.IsId, b.IsinAdi, b.Status
    Not İş adlarının tekrarlayabilme ihtimalinden dolayı IsId yide select sorgusuna ve group a eklenmelidir.

    • Düzenleyen Berdann 19 Aralık 2014 Cuma 09:11
    • Yanıt Olarak İşaretleyen Emre Bnzr 19 Aralık 2014 Cuma 12:09
    19 Aralık 2014 Cuma 09:00
  • Yardımınız için teşekkürler. Cevabınız çok doğru ama benim işimi çözmedi. Çünkü ben tam olarak elimdeki örneği paylaşmadım. Örnek tablo verdim ve dediğinizi yapınca farklı sorun aldım. Tam tabloları isimleri paylaşıyorum.

    TABLO ADI: HELPER

    TABLO ADI: WORK

    ilk sorgum:

    SELECT w.*,h.* FROM [Work](nolock) as w
    		left outer join Helper as h on h.WorkId=w.WorkId
    		WHERE 
            (w.WorkLastActivationDate BETWEEN @StartDate AND @EndDate)
            AND (w.WorkStatus=@Status OR @Status=0 OR @Status=NULL)
            AND (w.WorkKeeper=@Tsc OR @Tsc=0 OR @Tsc=NULL)
            AND (w.WorkSource=@Source OR @Source=0 OR @Source=NULL)
    

    Prosedürlerde bir problem yok. 

    Bu tablolar benim yazdığım örnekte ki gibi. Helper yardımcı demek bu işçi tablomuz, diğeri de İş Tablosu.. Bu HelperTime dediğim İşZamanı (Toplanmasını istediğim), Tsc denilen de IsçiId, diğer tabloda WorkKeeper ile aynı. (Tabloyu ben oluşturmadım isimleri farklı yapmışlar).. Bu komutu kullandığımda örneğin WorkId si 5 olan işi 3 işçi yaptıysa 3 tane ayrı kayıt geliyor. Bunu istemiyorum. Sizin verdiğiniz bilgiyle değiştirdiğimde;

    SELECT w.*,h.HelperId,h.Tsc,SUM(h.HelperTime),h.HelperDate,h.WorkId FROM [Work](nolock) as w
    		left outer join Helper as h on h.WorkId=w.WorkId
    		WHERE 
            (w.WorkLastActivationDate BETWEEN @StartDate AND @EndDate)
            AND (w.WorkStatus=@Status OR @Status=0 OR @Status=NULL)
            AND (w.WorkKeeper=@Tsc OR @Tsc=0 OR @Tsc=NULL)
            AND (w.WorkSource=@Source OR @Source=0 OR @Source=NULL)
    		group by h.WorkId
    Bunu yaptığımda da; 

    Column 'Work.WorkId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
    Hatası veriyor. Ve ben Work.WorkId'ye de ihtiyaç duyuyorum. Yani select sorgumda muhakkak olmalı.. Umarım anlatabildim.


    19 Aralık 2014 Cuma 11:33
  • Kolon adlarının tablolar arasında farklı olması karmaşalığa sebeb oluyor. Sizin orada Select sorgusunda verdiği hata w* dan geliyor. Çünkü siz Work tablosunda ki bütün kolonları getiriyorsunuz. O zaman bunları Group By a dahil etmeniz gerekiyor. Aynı şekilde w*, terimi ordan kaldırsanız h.HelperId de hata vericek. Sebebide aynı. Sizin burada yapmanız gereken şey. Sum ya da Count yaptığınız şeyler hariç göstermeye çalıştığınız bütün kolonları group by a almanız gerekiyor. Ama Group By ne işe yarıyor bunu bir araştırın. Çünkü Group By a dahil olan satırların bütün kolonları eşit(Sum ve Count terimleri içeren kolonlar hariç) olduğunda bir grup olur.

    O yüzden w.* yapmanızda ki amacınızı bir sorgulayın aynı şekilde helper.Id ye gerek var mı ? HelperDate diye birşey var bunu koyuyorsanız toplanıcak dataların tarihlerinin aynı olması lazım eğer farklıysa toplanmaz ayrı bir satır oluşur. Ve üstüne o alan DateTime'sa hiçbir şekilde toplanmaz.

    19 Aralık 2014 Cuma 11:46
  • Çok teşekkür ederim bilginiz için. Ben sorunu şu şekilde çözdüm. 

    SELECT w.*,(select SUM(h.HelperTime) from Helper as h where h.WorkId=w.WorkId group by h.WorkId) as HelperTime FROM [Work](nolock) as w
    		WHERE 
            (w.WorkLastActivationDate BETWEEN @StartDate AND @EndDate)
            AND (w.WorkStatus=@Status OR @Status=0 OR @Status=NULL)
            AND (w.WorkKeeper=@Tsc OR @Tsc=0 OR @Tsc=NULL)
            AND (w.WorkSource=@Source OR @Source=0 OR @Source=NULL)


    19 Aralık 2014 Cuma 12:09