Her ay satışı yapılan ürünler sql nasıl ??

diciboy

Öğrenci
Katılım
27 Ocak 2009
Mesajlar
70
Reaksiyon puanı
0
Puanları
0
Merhaba, elimde stokkartlarının ve satışların tutulduğu ve iki tablo var,
tblstsabit isminde bir tablo ve stok_kodu, stok_adı , barkod vs...
diğer tablo ise tblsatis isminde ve üç kolonu var birincisi stok_kodu, ikincisi ise satis_tarihi diğer bir kolon ise satis_miktarı.

bir rapor almak istiyorum ancak sql kodunu bi türlü, kurgulayamadım şöyleki: her ay satışı olan ürünleri yani 12 ayın her ayında mutlaka satışı bulunan ürünler raporu için nasıl bir sql kodu yazılmalıdır.

yardımlar için şimdiden teşekkürler ....
 

Webkurum

Profesör
Katılım
23 Nisan 2012
Mesajlar
1,818
Reaksiyon puanı
2
Puanları
218
Satışı yapıldı-yapılmadı tarzı düşünüyorsanız ;
Her ürüne bir değer atarsınız 1 ve 0
Değeri 1 olanları listeleyip satışı yapıldı ,
Değeri 0 olanları listeleyip satışı yapılmayanlar tarzında paylaşabilirsiniz.
 
S

SDN Okuru

SDN Okuru
SELECT stok_kodu, stok_adi vs...
FROM tblstsabit
WHERE stok_kodu IN (SELECT stok_kodu FROM tblsatis WHERE satis_tarihi >= '01-01-2013' AND satis_tarihi < '31-01-2013') gibi yapabilirsin. ya da having ile
HAVING MONTH(satis_tarihi) = 1
 

diciboy

Öğrenci
Katılım
27 Ocak 2009
Mesajlar
70
Reaksiyon puanı
0
Puanları
0
SELECT stok_kodu, stok_adi vs...
FROM tblstsabit
WHERE stok_kodu IN (SELECT stok_kodu FROM tblsatis WHERE satis_tarihi >= '01-01-2013' AND satis_tarihi < '31-01-2013') gibi yapabilirsin. ya da having ile
HAVING MONTH(satis_tarihi) = 1


bu kod tüm bir yılda her hangi bir zamanda satışı olan bilgiyi getirmektedir, benim istediğim biraz daha farklı .... 12 ayın ayrı ayrı 12 sinde de satışı olanları istiyorum...

Satışı yapıldı-yapılmadı tarzı düşünüyorsanız ;
Her ürüne bir değer atarsınız 1 ve 0
Değeri 1 olanları listeleyip satışı yapıldı ,
Değeri 0 olanları listeleyip satışı yapılmayanlar tarzında paylaşabilirsiniz.

bu yöntem bu soruya cevap olabilir, ancak işi biraz daha detaylandırıp günlerden bahsetmeye başladığımızda sanırım gün sayısı kadar kolon ekleyemeyiz, sonuçta sqlserverden bahsedersek belirli bi sayıyı destekliyordu bir tablo için 255 ti yanılmıyorsam... kaldıki eklesek bile sql kodu yazım bakımından yönetilemez bir hale gelebilir..
 
S

SDN Okuru

SDN Okuru
belki saçma olacak ama;

12 kolon ekle veritabanına (bunlar ayları temsil etsin)

ardından satış yapılan her ürün için, satış yapıldığı günü, ilgili ay kolonuna virgülle birleştirerek yaz. Örneğin kalem ürünü ocak ayının 1-2-3-4-5-17-22-30. günlerinde satıldıysa, ocak kolonuna (ya da month1 artık ne olarak adlandırırsan) 1,2,3,4,5,17,22,30 olarak her defasında eldeki veriye ekleme mantığıyla yazdırırsan, hem gün bilgilerini tutmuş olursun hem de satış yapıldığı bilgisini. Öyle ki, satış yapılmamış bir ürün için o ayın kolonu NULL bilgisi döndürecektir.

Php kullanıyorsan, satış yapılan gün bilgilerini çekmek için explode fonksiyonunu kullanabilirsin. Bunu da niye yazdım bilmiyorum :)

İşine yarar belki. Sabah 05.51 da bukadar çalışıyor kafa :)
 

eSa

Dekan
Katılım
5 Kasım 2011
Mesajlar
9,782
Reaksiyon puanı
352
Puanları
263
@diciboy bu şekilde sorgu düşünmek yerine bir çapraz sorgu ile ürünlerin tüm yıl satışlarını ay bazında tek sayfaya döksen olur mu?

Şu şekilde:

iGZs8vv.png



Sql Kodu :

Kod:
TRANSFORM Sum(satislar.Toplamiktar) AS ToplaToplamiktar
SELECT satislar.urun_kodu, Sum(satislar.Toplamiktar) AS [Yıl Toplamı]
FROM satislar
GROUP BY satislar.urun_kodu
PIVOT satislar.ay;
 

tambjk

Profesör
Katılım
10 Mayıs 2011
Mesajlar
3,263
Reaksiyon puanı
16
Puanları
218
bir ürün 7 aydır satıştaysa ve 7 ay boyunca çok deli satış rakamlarına ulaşmışsa bu 12 aylık sorgu patlar :) O listede gözükmesi için 1 sene beklemen gerekir.
 

tambjk

Profesör
Katılım
10 Mayıs 2011
Mesajlar
3,263
Reaksiyon puanı
16
Puanları
218
Eğer illa 12 ayın 12 sinde de satışı yapılanları istiyorsan şöyle birşey olabilir(oracle sql);

Kod:
select distinct(d1.name) from deneme d1 where 12=(select count(distinct(substr(d2.date,4,2))) from deneme d2 where d2.name = d1.name)

d2.date -> deneme tablosundaki date alanı. ve atıyorum tarih formatı 31-12-2012 yada 31.12.2012 ise biz buradan substr ile sadece ay bilgisini ayırıyoruz.
 

ugurturhal

Asistan
Katılım
10 Mayıs 2010
Mesajlar
194
Reaksiyon puanı
1
Puanları
16
eSa' nın yanıtına biraz benzer olacak ama şunu da kullanabilirsin;

satışların tutulduğu satislar adında bi tablon olsun ve alanları ID,urunID,ayID,yil,gun olsun. Her sattığın ürünü bu alana satır halinde ekle. Örneğin kalem ürünü 1. ayda 5 günde satıldıysa, (araya farklı kayıtlar da girebilr tabiki) veritabanına bunları ekle. Ekran görüntüsü şöyle olacak;



Burda urunID 1 olan kalem, 2 olan bilgisayar gibi düşün. Böyle böyle istediğin gibi listeleme yapabilirsin. yıl 2012 olanları ay bazında gruplayıp listele. Ya da ay 1 olanları ürün bazında gruplayıp listele. Tabi JOIN de kullanman gerekebilir. ve evet, 05.51 deki mesajı da ben yazdım, içimde kaldı, bu daha iyi bir çözümdür diye tekrar yazayım dedim :D

Saygılar...
 

diciboy

Öğrenci
Katılım
27 Ocak 2009
Mesajlar
70
Reaksiyon puanı
0
Puanları
0
sadece tarih bilgisi tutan ismi tbltarih ve kolonları yıl,ay olan bir tablo daha eklerim ve bu tablo ile cross join yaparım şöyleki:


ör: 2012 yılı için her ay mutlaka satışı yapılmış ürünler listele için:

tarih formatı : "2012-01-14"

select stok_kodu,substring(tblsatis.satis_tarihi,6,2) as ay,sum(satis_miktarı) as toplam_miktar
from
tbltarih cross join tblsatis
where
substring(tblsatis.satis_tarihi,6,2) is null
group by yıl,ay,stok_kodu,substring(tblsatis.satis_tarihi,6,2)


belki böyle olabilir. ..
 

annttiigs

Profesör
Katılım
7 Şubat 2007
Mesajlar
2,589
Reaksiyon puanı
24
Puanları
218
ekstra bir tabloya gerek yok gibi. zaten atış tarihleri vs var tablolardan birinde. ötekinde de stock kodları var. aradaki foreign key de var. Geriye bu iki tabloyu join edip arkasından tarihi parse etmek kalıyor.
 

diciboy

Öğrenci
Katılım
27 Ocak 2009
Mesajlar
70
Reaksiyon puanı
0
Puanları
0
ekstra bir tabloya gerek yok gibi. zaten atış tarihleri vs var tablolardan birinde. ötekinde de stock kodları var. aradaki foreign key de var. Geriye bu iki tabloyu join edip arkasından tarihi parse etmek kalıyor.
nasıl ? sql kod ?
 
Üst