Kompleks/Gelişmiş MYSQL/SQL Sorguları
Aşağıdaki sql sorgusu payment tablosundaki son altı ayın satışlarını aylık olarak listeler.
// SAKILA veritabanı, payment tablosu SELECT SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(CURDATE(),'%Y-%m') , amount, 0 ) ) 'Ay 1', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m'), amount, 0 ) ) 'Ay 2', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH),'%Y-%m'), amount, 0 ) ) 'Ay 3', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH),'%Y-%m'), amount, 0 ) ) 'Ay 4', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH),'%Y-%m'), amount, 0 ) ) 'Ay 5', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH),'%Y-%m'), amount, 0 ) ) 'Ay 6' FROM payment ORDER BY payment_date DESC
Yukarıdaki sql sorgusunu çalıştırdığımızda, aşağıdaki gibi bir sonuç elde etmiş oluruz.
Bu haftanın satışlarını bulmak için,
SELECT SUM(amount) as 'Bu hafta' FROM payment WHERE YEARWEEK(payment_date) = YEARWEEK(CURDATE()) ORDER BY payment_date
Bu ayın satışlarını bulmak için,
SELECT SUM(amount) as 'Bu Ay' FROM payment WHERE DATE_FORMAT(payment_date,'%Y-%m')=DATE_FORMAT(CURDATE(),'%Y-%m') ORDER BY payment_date
Bu yılın satışlarını bulmak için,
SELECT SUM(amount) as 'Bu Yıl' FROM payment WHERE DATE_FORMAT(payment_date,'%Y')=DATE_FORMAT(CURDATE(),'%Y') ORDER BY payment_date
Bu ay ve önceki ayın satışlarını bulmak için,
SELECT SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(CURDATE(),'%Y-%m'), amount, 0 ) ) 'Bu Ay', SUM( IF( DATE_FORMAT(payment_date,'%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m'), amount, 0 ) ) 'Önceki Ay' FROM payment
Son 10 satışı bulmak için,
SELECT payment_date, amount FROM payment ORDER BY payment_date DESC LIMIT 10
En yüksek 10 satışı bulmak için,
SELECT payment_date, max(amount) as fiyat FROM payment GROUP BY payment_date ORDER BY fiyat DESC LIMIT 10
En düşük 10 satışı bulmak için,
SELECT payment_date, min(amount) as fiyat FROM payment GROUP BY payment_date ORDER BY fiyat ASC LIMIT 10 /* 10 sayısı ilk 10 satışı verir. 15 olarak değiştirdimizde, en düşük 15 satışı bulmuş oluruz*/
Bu ayın en yüksek 10 satışını bulmak için,
SELECT payment_date,amount FROM payment WHERE MONTH(payment_date) = MONTH(CURDATE()) AND YEAR(payment_date) = YEAR(CURDATE()) AND YEAR(payment_date) = YEAR(CURDATE()) GROUP BY payment_date ORDER BY SUM(amount) DESC LIMIT 5
Müşteriye göre satışların toplamını, satışların ortalamasını ve satış adetinin bulunması için,
SELECT CONCAT(c.first_name,' ', c.last_name) as isim, SUM(p.amount) AS `Toplam`, AVG(p.amount) as 'Averaj', COUNT(*) as 'Adet' FROM payment p INNER JOIN customer c ON p.customer_id = c.customer_id GROUP BY isim ORDER BY `Toplam` DESC LIMIT 10
Günlere göre satış adetini bulmak,
Aşağıdaki sorgu Son 30 Gün, 30 ile 60 gün arası, 60 ile 90 gün arası ve 90 günden önceki satış adetlerini bulmak için kullanılabilir. Ufak bır değişlikle adet yerine satış toplam değerleride bulunabilir. Örneğin, SUM (IF’ deki 1 sayısı yerine amount yazıldığında satışların toplamını elde edersiniz.
SELECT SUM( IF( p.payment_date > DATE_SUB( SYSDATE( ) ,INTERVAL 30 DAY), 1, 0 ) ) 'Son 30 Gün', SUM( IF( p.payment_date BETWEEN DATE_SUB( SYSDATE( ) ,INTERVAL 60 DAY) AND DATE_SUB( SYSDATE( ) ,INTERVAL 30 DAY), 1, 0 ) ) '30-60 Gün', SUM( IF( p.payment_date BETWEEN DATE_SUB( SYSDATE( ) ,INTERVAL 90 DAY ) AND DATE_SUB( SYSDATE( ) ,INTERVAL 60 DAY ), 1, 0 ) ) '60-90 Gün', SUM( IF( p.payment_date <= DATE_SUB(SYSDATE(), INTERVAL 90 DAY), 1, 0 ) ) '90 Gün öncesi' FROM customer c INNER JOIN payment p ON p.customer_id = c.customer_id
Bir sorgu içinde bütün satışları, bu hafta, ay ve yıl içindeki bütün satışları bul,
SELECT Round(sum(d.amount),2) as 'Bütün Satışlar', ( SELECT Round(sum(b.amount),2) FROM payment b WHERE YEARWEEK(b.payment_date) = YEARWEEK(CURRENT_DATE) ) AS 'Bu Hafta', ( SELECT Round(sum(c.amount),2) FROM payment c WHERE date_format(c.`payment_date`, '%Y-%m') = date_format(now(), '%Y-%m') ) AS 'Bu Ay', ( SELECT Round(sum(d.amount),2) FROM payment d WHERE date_format(d.`payment_date`, '%Y') = date_format(now(), '%Y') ) AS 'Bu Yıl' FROM payment d
Yıllık, aylara göre toplam satışları ve satış adetini bul,
SELECT IfNull(Year,'Toplam') `Yıl`, `Ocak`, `Şubat`, `Mart`, `Nisan`, `Mayıs`, `Haziran`, `Temmuz`, `Ağustos`, `Eylül`, `Ekim`, `Kasım`, `Aralık`, Qty AS 'Satış Adedi', Yrly as 'Yıllık Toplam' FROM ( SELECT year(payment_date) AS 'Year', Round(Sum(CASE WHEN Month(payment_date)= 1 THEN amount ELSE 0 END),2) AS `Ocak`, Round(Sum(CASE WHEN Month(payment_date)= 2 THEN amount ELSE 0 END),2) AS `Şubat`, Round(Sum(CASE WHEN Month(payment_date)= 3 THEN amount ELSE 0 END),2) AS `Mart`, Round(Sum(CASE WHEN Month(payment_date)= 4 THEN amount ELSE 0 END),2) AS `Nisan`, Round(Sum(CASE WHEN Month(payment_date)= 5 THEN amount ELSE 0 END),2) AS `Mayıs`, Round(Sum(CASE WHEN Month(payment_date)= 6 THEN amount ELSE 0 END),2) AS `Haziran`, Round(Sum(CASE WHEN Month(payment_date)= 7 THEN amount ELSE 0 END),2) AS `Temmuz`, Round(Sum(CASE WHEN Month(payment_date)= 8 THEN amount ELSE 0 END),2) AS `Ağustos`, Round(Sum(CASE WHEN Month(payment_date)= 9 THEN amount ELSE 0 END),2) AS `Eylül`, Round(Sum(CASE WHEN Month(payment_date)=10 THEN amount ELSE 0 END),2) AS `Ekim`, Round(Sum(CASE WHEN Month(payment_date)=11 THEN amount ELSE 0 END),2) AS `Kasım`, Round(Sum(CASE WHEN Month(payment_date)=12 THEN amount ELSE 0 END),2) AS `Aralık`, Count(*) AS Qty, Round(Sum(amount),2) AS Yrly FROM payment GROUP BY year /*WITH ROLLUP - with rollup, tablonun son satırında satışların toplam degerlerini listeler. Pivot table*/ ) AS sums
PHP kullanarak aşağıdaki gibi bir tablo oluşturabilirsiniz.
Çeyrek içindeki bütün satışların toplamını, satışların adetini bul,
SELECT C.yil, C.ceyrek, C.adet,C.toplam FROM payment AS Q, ( SELECT YEAR(payment_date) AS yil, /*yıl*/ FLOOR( ( MONTH(payment_date) - 1 ) / 3 ) AS ceyrek, /*çeyrek*/ COUNT(*) AS adet, /*toplam satış adeti*/ SUM(amount) as toplam /*toplam satış*/ FROM payment GROUP BY YEAR(payment_date), FLOOR( ( MONTH(payment_date) - 1 ) / 3 ) ) AS C GROUP BY C.ceyrek ORDER BY C.yil, C.ceyrek
burayı tıklayın
buraya tıklayın (site ingilizcedir)