1

Konu: sql group..

Merhaba arkadaşlar,

Bir tablo var . Bu tabloda örneğin 10 field var.  n adet de satır.
Bu satırlardan bazılarının  field1, field2, field5 içerikleri aynı.  Bu aynı olan satırları tek bir satıra indirip adetlerini ADET fieldına  yazılması , tek (benzersiz olan ) satırlarda aynı tabloya adetleri 1 olarak aktarılması gerekiyor..
özetle o tablonun özetinin çıkarılması gerekiyor..
10 fielda sahip olan tabloda field1, field2, field5 içeriklerine benzer satırlar teke inecek.
Dolaylı şekilden yapıyorum.

SQL ile bunu basit ve hızlı bir şekilde yaptırabilir miyim?

2 Son düzenleyen, ugurlu2001 (06.06.2014 09:28:41)

Re: sql group..

Ne kadar doğru anladım bilemiyorum;

Örnek data olsa ve istenen sonuç değerini gösterebilsen daha kolay olucaktı..

Anladığıma göre :

Visual Fox Pro
LOCAL lni 

 
* Guid tanımlaması için MAIN.PRG de 1 kez tanımlamak yeterli.
declare integer CoCreateGuid  in ole32 as w32_CoCreateGuid;
string @GuidValue   
 
 
CREATE CURSOR CrsTablo (Field1 C(02), Field2 C(02), Field3 C(02), Field4 C(02), Field5 C(02), Field6 C(02), Field7 C(02), Field8 C(02), Field9 C(02), Field10 C(02) )
 
FOR m.lni = 1 TO 500
    INSERT INTO CrsTablo(Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10) ;
        VALUES ;
        (;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2)), ;
            (Substr(FastGuid(),1,2));
        )
ENDFOR
 
SELECT Distinct Field1 As Deger FROM CrsTablo ;
UNION ALL ;
SELECT Field2 FROM CrsTablo ;
UNION ALL ;
SELECT Field3 FROM CrsTablo ;
UNION ALL ;
SELECT Field4 FROM CrsTablo ;
UNION ALL ;
SELECT Field5 FROM CrsTablo ;
UNION ALL ;
SELECT Field6 FROM CrsTablo ;
UNION ALL ;
SELECT Field7 FROM CrsTablo ;
UNION ALL ;
SELECT Field8 FROM CrsTablo ;
UNION ALL ;
SELECT Field9 FROM CrsTablo ;
UNION ALL ;
SELECT Field10 FROM CrsTablo ;
INTO CURSOR CrsDistinct && Tüm Fieldların içerikleri sadece 1 sütunda ve her bir sütun değeri sadece 1 kez yazıldı.
 
SELECT Distinct ;
        Deger, ;
        Nvl(F1.Sayac,0)  As Sayac1, ;
        Nvl(F2.Sayac,0)  As Sayac2, ;
        Nvl(F3.Sayac,0)  As Sayac3, ;
        Nvl(F4.Sayac,0)  As Sayac4 ;
    FROM CrsDistinct ;
    LEFT JOIN (Select Field1, Count(Field1) As Sayac FROM CrsTablo GROUP BY Field1) As F1;
        ON CrsDistinct.Deger = F1.Field1 ;
    LEFT JOIN (Select Field2, Count(Field2) As Sayac FROM CrsTablo GROUP BY Field2) As F2;
        ON CrsDistinct.Deger = F2.Field2 ;
    LEFT JOIN (Select Field3, Count(Field3) As Sayac FROM CrsTablo GROUP BY Field3) As F3;
        ON CrsDistinct.Deger = F3.Field3 ;
    LEFT JOIN (Select Field4, Count(Field4) As Sayac FROM CrsTablo GROUP BY Field4) As F4;
        ON CrsDistinct.Deger = F4.Field4 ;
    ORDER BY Deger
 
&& Not :         Nvl(F1.Sayac,1)  As Sayac1, ; ile .NULL. -> (0) değerlerini 1 yapabilirsin!
 
FUNCTION FastGuid
    LOCAL lcGuidString
 
*!*        declare integer CoCreateGuid  in ole32 as w32_CoCreateGuid;
*!*        string @GuidValue    && GUID * pguid && Bir kez tanımla çok kez kullan
 
    m.lcGuidString = 0h00000000000000000000000000000000
    =w32_CoCreateGuid(@m.lcGuidString)
 
    return strconv(m.lcGuidString,15)
ENDFUNC
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3 Son düzenleyen, ugurlu2001 (06.06.2014 09:35:20)

Re: sql group..

Aydın abi, bir kaç detayı not olarak hatırlatmak isterim :

* Join ile kullandığın Field ların INDEX li olması performansını çok etkiler.
* VFP 'de, SQL engine in performansı; 5/6 dan fazla JOIN işlemi olduğunda anormal derece yavaşlayabiliyor. Böyle bir durum sözkonusu olduğunda ben önce istediğim SONUÇ tablosunu temp bir CURSOR ile oluşturuyorum ve ve sonrasında fazladan 3 / 5 insert + Update ile değer kümesini oluşturuyorum. Kodlama yönünden biraz angarya oluyor ama kimi durumlarda 10+ dk lık SQL sorgularımı 1 sn yenin altında alabiliyorum.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: sql group..

Saol uğur.. bir inceliyeyim..

5

Re: sql group..

Uğur aslında yapmak istediğim şu.

Bir parça listesi düşün her bir adet parça bir satıra yazılıyor. Ben bu listenin özetini çıkarmak istiyorum.

Aynı boyda ve renkte olan satırları birleştirerek yeni bir tabloya adetleri ile birlikte yazdırtmak istiyorum. Tabloda boy,renk, adet fieldleri dışında başka fieldler de var. Ama gruplama kriteri sadece boy , renk.  Senin önerini bir inceleyeyim. sonucu yazarım

6

Re: sql group..

Visual Fox Pro
select field1, field2, field5, count(*) as Adet from tabloAdi group by 1,2,3

degil mi?

7

Re: sql group..

cetinbasoz yazdı:
Visual Fox Pro
select field1, field2, field5, count(*) as Adet from tabloAdi group by 1,2,3

degil mi?

tam bu değil ..saçma ama şöyle olmalı

Visual Fox Pro
select  *, count(*) as Adet from tabloAdi group by 1,3,8

gibi

8

Re: sql group..

Yo sacma degil.

Visual Fox Pro
SELECT t2.Adet, t1.*  ;

FROM tabloAdi t1 ;
INNER JOIN (select field1, field2, field5, COUNT(*) AS Adet FROM tabloadi ;
GROUP BY field1, field2, field5) t2 ON t1.Field1 = t2.Field1 AND t1.Field2 = t2.Field2 and t1.Field5 = t2.Field5

9

Re: sql group..

Sonuc tablosunda field1, field2, field5 ayni olanlar tek satir olarak sonuclanacak ise ( o zaman mantiksal olarak diger kolon degerleri rastgele bir satirdan geliyor, bu fiziksel olarak son girilen kayit olabilir, ya da o kolonda o serideki min ya da max deger):

Versiyon bagimsiz:

Visual Fox Pro
select field1, field2, ;

   max(field3) as field3,  ;
   max(field4) as field4, ;
   field5,  ;
   max(fieldN) as fieldN, ;
  COUNT(*) AS Adet FROM tabloadi ;
  GROUP BY field1, field2, field5

VFP7'deki gibi fiziksel olarak girilen son kayit alinarak (mantiksal hata kabul ediliyor, dikkat et istedigin bu mu diye):

Visual Fox Pro
set enginebehavior 70

select *, COUNT(*) AS Adet FROM tabloadi GROUP BY field1, field2, field5
set enginebehavior 90

10

Re: sql group..

Yapmak istediğim bazı işlerde buna benzer syntax'a ihtiyacım vardı. Eline sağlık hocam.

cetinbasoz yazdı:

Yo sacma degil.

Visual Fox Pro
SELECT t2.Adet, t1.*  ;

FROM tabloAdi t1 ;
INNER JOIN (select field1, field2, field5, COUNT(*) AS Adet FROM tabloadi ;
GROUP BY field1, field2, field5) t2 ON t1.Field1 = t2.Field1 AND t1.Field2 = t2.Field2 and t1.Field5 = t2.Field5