none
Sql Cümlesi Değişken ile oluşturmak RRS feed

  • Soru

  • Biraz sql konusunda acemiyim.Yardım edenlere şimdiden teşekkür ederim.Şimdi elimde şöyle bir tablo var

    FirmaAdı

    Firma1

    Firma2

    Buradaki firmaları bir değişkene atayıp daha sonrasında aşağıdaki gibi bir cümle oluşturmak istiyorum. Aşağıdaki tabloda Firma 1 ve Firma2 yazan yerlere yukarıdan çektiğim firma isimleri gelecek yani yukarıdaki firma sayısı değişirse ona göre cümle de değişecek.Mesela aşağıdaki cümlede 2 tane 

    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma1' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma1'
    Cümlesi var.Yukarıdaki tabloda 3 tane varsa 3 tane bu cümleden olacak.Bilmiyorum anlatabildim mi.

    Select
    T.TasinirAdi,
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma1' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma1',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma2' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma2'
    from
    Teklifler T Group by T.TasinirAdi  

    Yani Yukarıda çektiğim firmalarla bir cümle oluşturma istiyorum.Bu mümkünmüdür.Yardımcı olanlara şimdiden teşekkürler. İnternetten araştırmam sırasında bir cümleyi bu komutlara uygulamaya çalıştım ancak olmadı sanırım.

    ALTER PROCEDURE ProcTeminIstatistik
    @cols as NVARCHAR(MAX),
    @query As NVARCHAR(MAX),
    @query1 As NVARCHAR(MAX)
    AS
    BEGIN
    SET NOCOUNT ON
    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(FirmaAdi)
                          FROM Teklifler
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '') 
    SET @query = 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + @cols + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+ @cols
    Set @query1='select T.TasinirAdi,' +@query+ ' fromTeklifler T  Group by T.TasinirAdi' 
    execute(@query1)
    END

    Bu kodu düzeltmeye çalıştım ancak başaramadım.yardımcı olursanız sevinirim.



    • Düzenleyen Marty McFly15 8 Aralık 2013 Pazar 18:43 Kod Hatası
    8 Aralık 2013 Pazar 18:33

Yanıtlar

  • Merhaba;

    Sql sorgunuzda da if ve else kullanabilirsiniz. if koşulu ile gelen değerin boş olup olmadığına bakabilirsiniz. 

    Burada ilgili bölüme ulaşabilirsiniz.

    Mesela sizin verdiğiniz örnekten gidersek (kodlarınızdan anladığım kadarıyla yazıyorum)

    ALTER PROCEDURE ProcTeminIstatistik
    @cols as NVARCHAR(MAX),
    @query As NVARCHAR(MAX),
    @query1 As NVARCHAR(MAX)
    AS
    BEGIN
    SET NOCOUNT ON
    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(FirmaAdi)
                          FROM Teklifler
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '') 
    IF (query1 is null)
    BEGIN
    SET @query = 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + @cols + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+ @cols
    execute(@query)
    END
    IF (@query1 is not null)
    BEGIN
    SET @query = 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + @cols + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+ @cols
    Set @query1='select T.TasinirAdi,' +@query+ ' fromTeklifler T  Group by T.TasinirAdi' 
    execute(@query1)
    END
    END


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 11 Aralık 2013 Çarşamba 18:50
    9 Aralık 2013 Pazartesi 07:09
  • Öncelikle verdiğiniz yanıt için çok teşekkür ederim.Ancak sanırım benim tablomdaki verileri çekmede bir sıkıntım var.

    SELECT distinct ',' +
                            QUOTENAME(FirmaAdi)
                          FROM Teklifler Where
                          FOR XML PATH(''), TYPE

    Şu kod ile sorgulama yaptığımda şöyle bir sonuç çıkıyor.

    Column1                                                                                                                                                                    -------------------------------------------------------------------------------------------------------------------------
    ,[A Firması],[B Firması] 

    Yani aslında ben çektiğim verileri birleştiriyorum Ancak amacı firma listesini çekmek.Bunu Şu kod ile firmaları listeleyebiliyorum.

    select Distinct FirmaAdi From Teklifler

    Bu kod ile listeledikten sonra gelen verileri döngüye sokarak aşağıdaki kodları elde etmek istiyorum.

    Yani amacım kısaca 2 Firma üzerinden gösterirsek A ve B Firması bu firmaları bir tabloya çekeceğim yukarıdaki kodla.Tablomda 1 sırada A firması 2. Sırada B firması var.Bunları aşağıdaki kodda nasıl bir sorgu hanline getirebilirim.Aşağıdaki A firması ve B Firması yazan yerlere çektiğim veriyi nasıl otomatik getiririm.

    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'A Firması' THEN T.YaklasikAlinanFiyat END,0)) AS 'A Firması',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'B Firması' THEN T.YaklasikAlinanFiyat END,0)) AS 'B Firması'
    Burada değişken kullanmak istememin nedeni firma sayısı ve adının değişiyor olması Örneğin 3 firma varsa kodum şu şekilde olacak.Firma A,Firma B ve Firma C olsun

    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma A' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma A',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma B' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma B',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma C' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma C'

    Umarım Anlatabilmişimdir.Şimdiden yardım eden herkese teşekkür ederim.



    • Düzenleyen Marty McFly15 9 Aralık 2013 Pazartesi 17:37
    • Yanıt Olarak İşaretleyen Marty McFly15 11 Aralık 2013 Çarşamba 18:50
    9 Aralık 2013 Pazartesi 16:27

Tüm Yanıtlar

  • Merhaba;

    Sql sorgunuzda da if ve else kullanabilirsiniz. if koşulu ile gelen değerin boş olup olmadığına bakabilirsiniz. 

    Burada ilgili bölüme ulaşabilirsiniz.

    Mesela sizin verdiğiniz örnekten gidersek (kodlarınızdan anladığım kadarıyla yazıyorum)

    ALTER PROCEDURE ProcTeminIstatistik
    @cols as NVARCHAR(MAX),
    @query As NVARCHAR(MAX),
    @query1 As NVARCHAR(MAX)
    AS
    BEGIN
    SET NOCOUNT ON
    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(FirmaAdi)
                          FROM Teklifler
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '') 
    IF (query1 is null)
    BEGIN
    SET @query = 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + @cols + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+ @cols
    execute(@query)
    END
    IF (@query1 is not null)
    BEGIN
    SET @query = 'Sum(ISNULL(CASE WHEN T.FirmaKodu = ' + @cols + ' THEN T.YaklasikAlinanFiyat END,0)) AS '+ @cols
    Set @query1='select T.TasinirAdi,' +@query+ ' fromTeklifler T  Group by T.TasinirAdi' 
    execute(@query1)
    END
    END


    Microsoft bu servisi kullanıcılarına yardım etme, Microsoft urunleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ucretsiz sunmaktadır. Bu icerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi bir sorumluluk ustlenildiği anlamına gelmez. Iletişim: barissaritas[at]windowslive[nokta]com

    • Yanıt Olarak İşaretleyen Marty McFly15 11 Aralık 2013 Çarşamba 18:50
    9 Aralık 2013 Pazartesi 07:09
  • Öncelikle verdiğiniz yanıt için çok teşekkür ederim.Ancak sanırım benim tablomdaki verileri çekmede bir sıkıntım var.

    SELECT distinct ',' +
                            QUOTENAME(FirmaAdi)
                          FROM Teklifler Where
                          FOR XML PATH(''), TYPE

    Şu kod ile sorgulama yaptığımda şöyle bir sonuç çıkıyor.

    Column1                                                                                                                                                                    -------------------------------------------------------------------------------------------------------------------------
    ,[A Firması],[B Firması] 

    Yani aslında ben çektiğim verileri birleştiriyorum Ancak amacı firma listesini çekmek.Bunu Şu kod ile firmaları listeleyebiliyorum.

    select Distinct FirmaAdi From Teklifler

    Bu kod ile listeledikten sonra gelen verileri döngüye sokarak aşağıdaki kodları elde etmek istiyorum.

    Yani amacım kısaca 2 Firma üzerinden gösterirsek A ve B Firması bu firmaları bir tabloya çekeceğim yukarıdaki kodla.Tablomda 1 sırada A firması 2. Sırada B firması var.Bunları aşağıdaki kodda nasıl bir sorgu hanline getirebilirim.Aşağıdaki A firması ve B Firması yazan yerlere çektiğim veriyi nasıl otomatik getiririm.

    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'A Firması' THEN T.YaklasikAlinanFiyat END,0)) AS 'A Firması',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'B Firması' THEN T.YaklasikAlinanFiyat END,0)) AS 'B Firması'
    Burada değişken kullanmak istememin nedeni firma sayısı ve adının değişiyor olması Örneğin 3 firma varsa kodum şu şekilde olacak.Firma A,Firma B ve Firma C olsun

    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma A' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma A',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma B' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma B',
    Sum(ISNULL(CASE WHEN T.FirmaKodu = 'Firma C' THEN T.YaklasikAlinanFiyat END,0)) AS 'Firma C'

    Umarım Anlatabilmişimdir.Şimdiden yardım eden herkese teşekkür ederim.



    • Düzenleyen Marty McFly15 9 Aralık 2013 Pazartesi 17:37
    • Yanıt Olarak İşaretleyen Marty McFly15 11 Aralık 2013 Çarşamba 18:50
    9 Aralık 2013 Pazartesi 16:27
  • slm şimdi kodlarını inceledim herkes düşünmekte özgür benim aldığım eğitime göre yaptığın yanlış neden sql yormaktan başka bişey yapmıyorsun sql tarafında neden işlem yapıyosun hala anlamış değilim o yüzden yazdığın kodlar karışık geldi bana biz nasıl yapıldığını yüzeysel olarak gördük ama üzerinde pek durmadık .

    benim bildiğim kadarıyla şöyle yapıyorduk biz bütün veriyi çekeriz çekerken n istiyon özel a fimanın sahibyle b firmasının sahibini yan yana yazdırmak istiyorsun şirketler dizesi adı altında f1 f2 diye bunları parametreliyorsun firma tam adı diye bir parametre oluşturursun c# tarafında bunları set ederken

    firmatamadı=f1.firmaSahibi+" "+f2.firmaSahibi;

    diye set edersin al sana istediğin bilgi özel n istiyorsan sahib olursun istersen a firmasının gelirini b firmasının geliriyle topla c firmasının gelirini çıkar bunlardan  sen bir işlem için sqlde hesap yapıyorsun yarın başka bir işlem yapman gerekti onadamı sorgu yazacan sql yoracan verinin hepsini çek n istiyorsan isteğin zaman iştedigin şekilde yap.

    yardımcı olduysam puan ver :)

    olamadıysam araştırmaya devam:)

    9 Aralık 2013 Pazartesi 18:22
  • C# tarafında evet bu işlemleri yapmak basit bir işlem zaten o kısımda bir problem de yok ancak performans ve güvenlik açısından benim bu kodlamayı SQL de yapmam gerekiyor.Bunları ben stored procedure olarak saklıyorum.Aynı zamanda SQL dilinde biraz daha ilerlemek istiyorum.
    9 Aralık 2013 Pazartesi 18:42