Anasayfa / Yazılım / SQL / Birden Fazla Tablo Üzerinde Toplama Fonksiyonlarını Kullanmak

Birden Fazla Tablo Üzerinde Toplama Fonksiyonlarını Kullanmak

Toplama fonksiyonlarını GROUP BY ve HAVING deyimlerini kullanarak birden fazla tablo üzerinde yani birleştirilmiş tablolar üzerinde de kullanabiliriz.

Şimdi Sales.Customer ve Sales.SalesOrderHeader tabloları üzerinde her müşteri başına siparişlerin toplamı ve siparişlerin toplam tutarını bulmak için bir takım örnekler yapalım.

1)

SELECT Musteri.CustomerID, Musteri.AccountNumber, COUNT(*) AS "Sipariş Sayısı",
SUM(TotalDue) AS "Total Due Toplamı" FROM Sales.Customer AS Musteri
INNER JOIN Sales.SalesOrderHeader AS SatisSiparisBaslik
ON Musteri.CustomerID = SatisSiparisBaslik.CustomerID
GROUP BY Musteri.CustomerID, Musteri.AccountNumber ORDER BY Musteri.CustomerID

2013031729

Bu sorgumun sonucunda sipariş yapan tüm müşteriler yer alıyor.

2)

SELECT Musteri.CustomerID, Musteri.AccountNumber, COUNT(*) AS "Sipariş Sayısı",
SUM(TotalDue) AS "Total Due Toplamı" FROM Sales.Customer AS Musteri
LEFT OUTER JOIN Sales.SalesOrderHeader AS SatisSiparisBaslik
ON Musteri.CustomerID = SatisSiparisBaslik.CustomerID
GROUP BY Musteri.CustomerID, Musteri.AccountNumber ORDER BY Musteri.CustomerID;

2013031730

Bu sorgum 1. sorgu ile aynı ama bu sefer INNER JOIN yerine LEFT OUTER JOIN kullandım. Tüm müşterileri kapsıyor ama hepsi için sipariş sayısı 1 dönüyor ve Total Due Toplamı NULL.. Yanlış sorgu..

3)

SELECT Musteri.CustomerID, Musteri.AccountNumber, 
COUNT(SatisSiparisBaslik.SalesOrderID) AS "Sipariş Sayısı",
SUM(COALESCE(TotalDue,0)) AS "Total Due Toplamı" FROM Sales.Customer AS Musteri
LEFT OUTER JOIN Sales.SalesOrderHeader AS SatisSiparisBaslik
ON Musteri.CustomerID = SatisSiparisBaslik.CustomerID
GROUP BY Musteri.CustomerID, Musteri.AccountNumber ORDER BY Musteri.CustomerID

2013031731

Sorgumda COUNT(*) yerine COUNT(SatisSiparisBaslik.SalesOrderID) kullanarak 1. sorgumda karşılaştığım problemi çözdüm. Böylelikle NULL verileri eledim ve sipariş vermeyen müşteriler için de 0 döndü. COALESCE kullanarakda NULL yerine 0 döndürerek ikinci sorgumdaki problemi çözdüm.

4) Person.Person, Sales.Customer ve Sales.SalesOrderHeader tablolarını birleştirerek sipariş edilmiş olan ürünlere göre müşteri adlarını listeleyelim.

SELECT FirstName, MiddleName, LastName, COUNT(*) AS "Sipariş Sayısı" 
FROM Person.Person AS Kisi 
INNER JOIN Sales.Customer AS Musteri ON Kisi.BusinessEntityID = Musteri.PersonID
INNER JOIN Sales.SalesOrderHeader AS SatisSiparisBaslik
ON Musteri.CustomerID = SatisSiparisBaslik.CustomerID 
GROUP BY FirstName,MiddleName,LastName

2013031732

5) Sales.SalesOrderHeader, Sales.SalesOrderDetail ve Production.Product tablolarını birleştirerek ProductID ve
OrderDate kolonlarına göre ürünlerin toplamlarını listeleyelim.

SELECT Urun.ProductID, SatisSiparisBaslik.OrderDate, SUM(OrderQty) AS "Sipariş Sayısı"
FROM Sales.SalesOrderHeader AS SatisSiparisBaslik 
INNER JOIN Sales.SalesOrderDetail AS SatisSiparisDetay
ON SatisSiparisBaslik.SalesOrderID = SatisSiparisDetay.SalesOrderDetailID
INNER JOIN Production.Product AS Urun
ON SatisSiparisDetay.ProductID = Urun.ProductID
GROUP BY Urun.ProductID, SatisSiparisBaslik.OrderDate

2013031733

3 yorum

  1. Merhaba , örnekler çok güzel çok anlaşılır. Ben şunu sormak istiyorum , siparişleri stoktan düşürmek için nasıl bir fonksiyon oluşturabiliriz. örneğin Urun Adeti 5 Sipariş Sayısı 3 Stokta Kalan 2 olmalı ve ürün türüne göre listelemeli. Yardımınız için şimdiden teşekkürler

  2. Hocam iki tablom var;
    1. tablo; kursiyerid, adı,soyadı
    2. tablo; kursiyerid, borç, alacak

    kursiyerin ödemelerini 2. tabloda id numarasına göre tutuyorum. ( aynı id ile 10 alacak girişi olabilir)

    Ben Adı, soyadı, toplamborç, toplamalacak, toplam bakiye (toplamborç-toplam alacak) şeklinde sorgu yapıp datagridwiew e atmak istiyorum bir türlü sorgu cümlesini yapamadım. yardımcı olabilir misiniz?

  3. hoca Türkçe yapsan ya tablo isimleri çözene kadar perişan oldum halen daha çözemediğim yerler var

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir