Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Group By Kullanımına ait birkaç örnek
#1
az önce bir arakdaşın isteğinden yola çıkarak ve referans gösteriğim sitedeki örnekleri biraz değiştirirek 
MS SQL Group kullanımına ait bir kaç örnek yapmaya ve paylaşmaya çalıştım
umaraım faydalı olur

USE [Test]
GO
/****** Object:  Table [dbo].[TableOrnek]    Script Date: 28.08.2019 15:04:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableOrnek](
[IdAuto] [int] IDENTITY(1,1) NOT NULL,
[Personel] [nvarchar](50) NULL,
[Donem] [nvarchar](50) NULL,
[Tutar] [decimal](18, 2) NULL,
CONSTRAINT [PK_TableOrnek] PRIMARY KEY CLUSTERED 
(
[IdAuto] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[TableOrnek] ON 
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (1, N'ALİ', N'2019/01', CAST(10.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (2, N'ALİ', N'2019/01', CAST(15.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (3, N'ALİ', N'2019/02', CAST(20.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (4, N'ALİ', N'2019/03', CAST(25.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (5, N'VELİ', N'2019/01', CAST(33.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (6, N'VELİ', N'2019/02', CAST(85.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (7, N'VELİ', N'2019/03', CAST(45.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (8, N'AYŞE', N'2019/01', CAST(99.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (9, N'AYŞE', N'2019/02', CAST(55.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (10, N'AYŞE', N'2019/02', CAST(11.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (11, N'AYŞE', N'2019/02', CAST(22.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (12, N'FATMA', N'2019/01', CAST(55.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (13, N'FATMA', N'2019/02', CAST(75.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (14, N'FATMA', N'2019/03', CAST(16.00 AS Decimal(18, 2)))
GO
SET IDENTITY_INSERT [dbo].[TableOrnek] OFF
GO


Select * From TableOrnek
   

Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Cube(Personel, Donem)
   

  Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
   From TableOrnek
  Group By Rollup(Personel, Donem)
   

  
Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Personel, Donem)
   

  Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Personel, Rollup(Donem))
   

   Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Rollup(Personel, Donem))
   
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#2
Ellerinize sağlık.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
(28-08-2019, Saat: 15:20)adelphiforumz Adlı Kullanıcıdan Alıntı: az önce bir arakdaşın isteğinden yola çıkarak ve referans gösteriğim sitedeki örnekleri biraz değiştirirek 
MS SQL Group kullanımına ait bir kaç örnek yapmaya ve paylaşmaya çalıştım
umaraım faydalı olur

USE [Test]
GO
/****** Object:  Table [dbo].[TableOrnek]    Script Date: 28.08.2019 15:04:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TableOrnek](
[IdAuto] [int] IDENTITY(1,1) NOT NULL,
[Personel] [nvarchar](50) NULL,
[Donem] [nvarchar](50) NULL,
[Tutar] [decimal](18, 2) NULL,
CONSTRAINT [PK_TableOrnek] PRIMARY KEY CLUSTERED 
(
[IdAuto] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[TableOrnek] ON 
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (1, N'ALİ', N'2019/01', CAST(10.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (2, N'ALİ', N'2019/01', CAST(15.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (3, N'ALİ', N'2019/02', CAST(20.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (4, N'ALİ', N'2019/03', CAST(25.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (5, N'VELİ', N'2019/01', CAST(33.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (6, N'VELİ', N'2019/02', CAST(85.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (7, N'VELİ', N'2019/03', CAST(45.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (8, N'AYŞE', N'2019/01', CAST(99.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (9, N'AYŞE', N'2019/02', CAST(55.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (10, N'AYŞE', N'2019/02', CAST(11.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (11, N'AYŞE', N'2019/02', CAST(22.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (12, N'FATMA', N'2019/01', CAST(55.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (13, N'FATMA', N'2019/02', CAST(75.00 AS Decimal(18, 2)))
GO
INSERT [dbo].[TableOrnek] ([IdAuto], [Personel], [Donem], [Tutar]) VALUES (14, N'FATMA', N'2019/03', CAST(16.00 AS Decimal(18, 2)))
GO
SET IDENTITY_INSERT [dbo].[TableOrnek] OFF
GO


Select * From TableOrnek


Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Cube(Personel, Donem)


  Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
   From TableOrnek
  Group By Rollup(Personel, Donem)


  
Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Personel, Donem)


  Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Personel, Rollup(Donem))


   Select IsNull(Personel, 'Personel Toplam') As Personel,  IsNull(Donem, 'Donem Toplam') As Donem,  Sum(Tutar) As Tutar
    From TableOrnek
  Group By Grouping Sets(Rollup(Personel, Donem))

Merhabalar,

Güzel bir çalışma olmuş. Elinize sağlık.

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#4
Ellerinize sağlık güzel olmuş.
Cevapla
#5
Teşekkürler Elinize sağlık
Cevapla
#6
Arkadaşlar merhaba, bir sorum olacak. Soru group by ile alakalı olduğu için yeni konu açmayıp buraya yazmak istedim.

Bir firebird tabloda, eklediğim resimde sarı alandaki gibi alanlar ve veriler bulunuyor. Bu tabloda

* Yıllar bir kere listelenecek
* Her yılda adet toplamı 10 'dan fazla olan kaç kişi var.

Sonuç olarak sağda yeşil kısımdaki sonucu elde edebilmek için sql sorgusu nasıl olmalı acaba?

czgn1wb.jpg
Cevapla
#7
(24-01-2022, Saat: 21:59)sunbeki Adlı Kullanıcıdan Alıntı: Arkadaşlar merhaba, bir sorum olacak. Soru group by ile alakalı olduğu için yeni konu açmayıp buraya yazmak istedim.

Bir firebird tabloda, eklediğim resimde sarı alandaki gibi alanlar ve veriler bulunuyor. Bu tabloda

* Yıllar bir kere listelenecek
* Her yılda adet toplamı 10 'dan fazla olan kaç kişi var.

Sonuç olarak sağda yeşil kısımdaki sonucu elde edebilmek için sql sorgusu nasıl olmalı acaba?

czgn1wb.jpg

Having ile bu işlemi gerçekleştirebilirsin.

SELECT YIL , SUM(ADET) KISITOPLAM , COUNT(ADET) KISIADET
FROM TABLO 
GROUP BY YIL
HAVING SUM(ADET) > 10
Sorsaydı Bilirdi Sormuyor ki Bilsin.
Bilseydi Sorardı Bilmiyor ki Sorsun. 
Cevapla
#8
(24-01-2022, Saat: 21:59)sunbeki Adlı Kullanıcıdan Alıntı: Arkadaşlar merhaba, bir sorum olacak. Soru group by ile alakalı olduğu için yeni konu açmayıp buraya yazmak istedim.

Bir firebird tabloda, eklediğim resimde sarı alandaki gibi alanlar ve veriler bulunuyor. Bu tabloda

* Yıllar bir kere listelenecek
* Her yılda adet toplamı 10 'dan fazla olan kaç kişi var.

Sonuç olarak sağda yeşil kısımdaki sonucu elde edebilmek için sql sorgusu nasıl olmalı acaba?

czgn1wb.jpg

istediğiniz böyle bir şey mi?

select YIL ,COUNT (DISTINCT ADI)AS KISI_SAYISI, SUM(ADET)  FROM TABLO GROUP BY YIL having sum(ADET)>=10 ;
VEYA
select DISTINCT YIL,(COUNT(YIL)), SUM(ADET)  FROM TABLO GROUP BY YIL,ADI having sum(ADET)>=10  ORDER BY YIL DESC;
VEYA
SELECT YIL , SUM(ADET)  AS TOPLAM , COUNT(ADET) AS KISI_SAYISI FROM TABLO GROUP BY YIL,ADI HAVING SUM(ADET) >= 10 ORDER BY YIL DESC;
VEYA
SELECT YIL , SUM(ADET)  AS TOPLAM , COUNT(ADET) AS KISI_SAYISI , ADI FROM TABLO GROUP BY YIL,ADI HAVING SUM(ADET) >= 10 ORDER BY YIL DESC;

Cevapla
#9
Arkadaşlar maalesef yazdığınız kullanımlar istediğim sonucu vermiyor.

Ben biraz uğraştım. Aşağıdaki kod ile şu sonucu elde ettim.

YIL      KISI_SAYISI
2018         1
2020         1
2020         1
2021         1
2021         1
2022         1


Select COUNT(DISTINCT(ADI)) as KISI_SAYISI ,YIL from tablo1
Group By ADI,YIL
Having sum(ADET) >= 10 Order by YIL


Burada 2019 yılındaki kişi sayısı sıfır olduğu için listelenmemiş. Bu sorun değil.

Ama bu sonucu yıllara göre yine gruplaması lazım. Yani sonuç şöyle olmalı...

YIL      KISI_SAYISI
2018         1
2020         2
2021         2
2022         1
Cevapla
#10
(25-01-2022, Saat: 14:01)sunbeki Adlı Kullanıcıdan Alıntı: Arkadaşlar maalesef yazdığınız kullanımlar istediğim sonucu vermiyor.

Ben biraz uğraştım. Aşağıdaki kod ile şu sonucu elde ettim.

YIL      KISI_SAYISI
2018         1
2020         1
2020         1
2021         1
2021         1
2022         1


Select COUNT(DISTINCT(ADI)) as KISI_SAYISI ,YIL from tablo1
Group By ADI,YIL
Having sum(ADET) >= 10 Order by YIL


Burada 2019 yılındaki kişi sayısı sıfır olduğu için listelenmemiş. Bu sorun değil.

Ama bu sonucu yıllara göre yine gruplaması lazım. Yani sonuç şöyle olmalı...

YIL      KISI_SAYISI
2018         1
2020         2
2021         2
2022         1

Senin sorgunda Group By ADI,YIL bölümünden ADI nı çıkarırsan istediğin sonuca ulaşırsın sanırım.
yada alttaki örneğe bi bak istersen, boş olan yıllarda geliyor.

DECLARE @T TABLE (YIL SMALLINT , ADI VARCHAR(30) , ADET TINYINT );

INSERT INTO @T VALUES (2001 ,  'osman' , 1);
INSERT INTO @T VALUES (2002 ,  'osman' , 1);
INSERT INTO @T VALUES (2003 ,  'osman' , 1);
INSERT INTO @T VALUES (2004 ,  'osman' , 1);
INSERT INTO @T VALUES (2005 ,  'osman' , 4);

INSERT INTO @T VALUES (2001 ,  'ahmet' , 1);
INSERT INTO @T VALUES (2002 ,  'ahmet' , 6);
INSERT INTO @T VALUES (2003 ,  'ahmet' , 3);
INSERT INTO @T VALUES (2004 ,  'ahmet' , 2);
INSERT INTO @T VALUES (2005 ,  'ahmet' , 9);

INSERT INTO @T VALUES (2001 ,  'ramazan' , 1);
INSERT INTO @T VALUES (2002 ,  'ramazan' , 4);
INSERT INTO @T VALUES (2003 ,  'ramazan' , 8);
INSERT INTO @T VALUES (2004 ,  'ramazan' , 2);
INSERT INTO @T VALUES (2005 ,  'ramazan' , 6);

INSERT INTO @T VALUES (2001 ,  'abdullah' , 1);
INSERT INTO @T VALUES (2002 ,  'abdullah' , 1);
INSERT INTO @T VALUES (2003 ,  'abdullah' , 1);
INSERT INTO @T VALUES (2004 ,  'abdullah' , 2);
INSERT INTO @T VALUES (2005 ,  'abdullah' , 1);

SELECT F.YIL , ISNULL(ADET,0)  ADET
FROM (select DISTINCT YIL FROM @t ) F 
FULL OUTER JOIN (
Select YIL  , COUNT(DISTINCT(ADI)) as ADET 
from  @t 
Group By  YIL
Having sum(ADET) >= 10 
) T ON F.YIL = T.YIL
Order by F.YIL
Sorsaydı Bilirdi Sormuyor ki Bilsin.
Bilseydi Sorardı Bilmiyor ki Sorsun. 
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi