Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
En çok satılan miktarı bulmak.
#1
Arkadaşlar Merhaba; SQL de en çok satılan stok miktarını bulmak istedim bir türlü istediğim raporu alamadım. Nerede hata yapıyorum bakabilir misiniz?
Yapmak istediğim, Stok Kodunu gruplamak ve en yüksek miktarı bulmak.


SELECT TOP 100 T.STOK_ADI,T.STOK_KODU,SH.MIKTAR FROM (
select STOK_KODU,CS.CARI_KOD,CS.CARI_ISIM, sum(sthar_gcmik) as MIKTAR from tblsthar
LEFT OUTER JOIN TBLCASABIT CS ON CS.CARI_KOD = TBLSTHAR.STHAR_CARIKOD 
where STHAR_HTUR IN ('I','J','K') and sthar_gckod='C' group by stok_kodu order by MIKTAR DESC) AS SH,
(SELECT STOK_KODU,STOK_ADI FROM TBLSTSABIT GROUP BY STOK_KODU,STOK_ADI) AS T 
 
Cevapla
#2
GPT efendinin yorumu

Sizin SQL sorgunuzda birkaç sorun var. Şunları göz önünde bulundurabiliriz:

JOIN ile İlişkilendirme Eksikliği: TBLSTHAR tablosunda STOK_KODU ile ilişkilendirme yapılmıyor. SH (içsel sorgu) kısmındaki STOK_KODU ile TBLSTSABIT tablosundaki STOK_KODU arasında doğru bir ilişki kurmalısınız.

GROUP BY ve ORDER BY Sırasındaki Karışıklık: GROUP BY ile gruplama yapıyorsunuz ancak ORDER BY kısmını sorgunun sonunda doğru konumda yazmalısınız.

TOP 100 Kullanımı: TOP 100 ifadesi ana sorguda ORDER BY ile sıralandıktan sonra uygulanmalı, çünkü Miktar değerine göre en yüksek 100 sonucu istiyorsanız, iç sorgudan çıkan veriyi sıralamadan önce TOP 100 kullanmak sorunu çözmüyor.

İşte önerilen düzenlenmiş sorgu:
SELECT TOP 100 
   T.STOK_ADI,
   T.STOK_KODU,
   SH.MIKTAR
FROM (
   SELECT 
       STOK_KODU,
       SUM(sthar_gcmik) AS MIKTAR 
   FROM tblsthar
   LEFT OUTER JOIN TBLCASABIT CS ON CS.CARI_KOD = tblsthar.STHAR_CARIKOD 
   WHERE STHAR_HTUR IN ('I', 'J', 'K') 
   AND sthar_gckod = 'C' 
   GROUP BY STOK_KODU
   ORDER BY MIKTAR DESC
) AS SH
INNER JOIN TBLSTSABIT T ON T.STOK_KODU = SH.STOK_KODU
ORDER BY SH.MIKTAR DESC;

DeepSeek
Tamam, kullanıcının SQL sorgusunda en çok satılan stok miktarını bulmaya çalıştığını ancak istediği raporu alamadığını söylüyor. Öncelikle, yazdığı sorguyu adım adım incelemem gerekiyor.

İlk olarak, kullanıcı iki alt sorgu (subquery) kullanmış: SH ve T. SH alt sorgusunda stok_kodu, CARI_KOD, CARI_ISIM ve toplam MIKTAR'ı hesaplamış. TBLSTHAR tablosunu TBLCASABIT ile LEFT JOIN yapmış. STHAR_HTUR değerleri I, J, K olan ve sthar_gckod='C' olan kayıtları seçmiş. Gruplama yaparken stok_kodu'na göre gruplamış, ancak CARI_KOD ve CARI_ISIM de eklemiş. Burada bir hata olabilir çünkü GROUP BY'da tüm non-aggregate sütunlar belirtilmeli. Yani stok_kodu, CARI_KOD, CARI_ISIM hepsi GROUP BY'da olmalı. Aksi takdirde hata alır. Ancak kullanıcının sorgusunda sadece stok_kodu gruplanmış. Bu muhtemelen bir hata kaynağı.

İkinci alt sorgu T'de ise TBLSTSABIT'ten stok_kodu ve stok_adi'yi grupluyor. Bu kısımda zaten stok_kodu unique olmalı, bu yüzden burada sorun yok.

Ana sorguda SH ve T'yi JOIN'liyor ama JOIN koşulunu belirtmemiş. Yani FROM içinde virgülle iki tablo yazılmış, bu CROSS JOIN anlamına gelir. Bu da tüm kombinasyonları getireceğinden yanlış sonuçlara sebep olur. SH ile T'yi stok_kodu üzerinden JOIN yapması gerekir. Ayrıca CARI_KOD ve CARI_ISIM'i SELECT'te kullanmış ama gruplamada eksiklik var. Ayrıca, TOP 100 kullanmış ama ORDER BY yapmamış. Ana sorguda ORDER BY olmadığı için en yüksek miktarlı kayıtları getirmeyebilir.

Çözüm için öncelikle SH alt sorgusunda GROUP BY'a CARI_KOD ve CARI_ISIM eklenmeli. Ama asıl amaç stok bazlı satış miktarı ise CARI_KOD ve CARI_ISIM'i sorgudan çıkarmak daha doğru olur. Çünkü stok başına toplam satış miktarı aranıyorsa, carileri dahil etmek veriyi carilerle birlikte gruplayarak stok kodunu unique yapmayacaktır. Yani her stok ve carinin kombinasyonu için toplam miktar hesaplanır. Bu durumda stok başına maksimum miktarı bulmak istiyorsak bu doğru olmaz.

Ayrıca, ana sorguda JOIN eksik. SH ve T tablolarını stok_kodu üzerinden birleştirmeli. CROSS JOIN yerine INNER JOIN kullanmalı ve ON ile şart belirtmeli.

Ayrıca, en yüksek miktarı bulmak için ORDER BY MIKTAR DESC ile sıralayıp TOP 1 almak gerekebilir. Ancak kullanıcı TOP 100 kullanmış, belki en çok satan 100 stok istiyor. Ancak SH alt sorgusunda order by yapılmış ama ana sorguda yapılmamış. Bu da doğru sıralamayı etkileyebilir.

Sonuç olarak, düzeltilmesi gereken noktalar:

1. SH alt sorgusundaki GROUP BY'a CARI_KOD ve CARI_ISIM eklenmeli veya bu sütunlar sorgudan çıkarılmalı. Eğer stok bazlı toplam isteniyorsa, CARI bilgileri sorguda olmamalı.

2. Ana sorguda SH ve T tabloları arasında stok_kodu üzerinden JOIN yapılmalı.

3. ORDER BY MIKTAR DESC ana sorguda olmalı, çünkü TOP 100 en yüksekleri almak için sıralama gerekli.

4. CARI_KOD ve CARI_ISIM SELECT'te kullanılıyorsa, GROUP BY'da da olmalı. Ama stok bazlı rapor isteniyorsa, muhtemelen bu sütunlar gereksiz.

Örnek düzeltilmiş sorgu şöyle olabilir:

Stok bazlı toplam miktarı hesaplamak için CARI bilgilerini çıkarıp, sadece stok_kodu'na göre gruplamak. Sonra T ile birleştirip, en yüksek miktarlı ilk 100 kaydı sıralamak.

SELECT TOP 100 
 T.STOK_ADI,
 T.STOK_KODU,
 SH.TOPLAM_MIKTAR
FROM 
 (SELECT 
    STOK_KODU, 
    SUM(sthar_gcmik) AS TOPLAM_MIKTAR 
  FROM tblsthar
  WHERE 
    STHAR_HTUR IN ('I','J','K') 
    AND sthar_gckod = 'C'
  GROUP BY STOK_KODU) AS SH
INNER JOIN 
 (SELECT 
    STOK_KODU, 
    STOK_ADI 
  FROM TBLSTSABIT) AS T 
 ON SH.STOK_KODU = T.STOK_KODU
ORDER BY SH.TOPLAM_MIKTAR DESC;

Yatırım tavsiyesi değildir Big Grin
Cevapla
#3
(08-02-2025, Saat: 10:24)Hayati Adlı Kullanıcıdan Alıntı: GPT efendinin yorumu

Sizin SQL sorgunuzda birkaç sorun var. Şunları göz önünde bulundurabiliriz:

JOIN ile İlişkilendirme Eksikliği: TBLSTHAR tablosunda STOK_KODU ile ilişkilendirme yapılmıyor. SH (içsel sorgu) kısmındaki STOK_KODU ile TBLSTSABIT tablosundaki STOK_KODU arasında doğru bir ilişki kurmalısınız.

GROUP BY ve ORDER BY Sırasındaki Karışıklık: GROUP BY ile gruplama yapıyorsunuz ancak ORDER BY kısmını sorgunun sonunda doğru konumda yazmalısınız.

TOP 100 Kullanımı: TOP 100 ifadesi ana sorguda ORDER BY ile sıralandıktan sonra uygulanmalı, çünkü Miktar değerine göre en yüksek 100 sonucu istiyorsanız, iç sorgudan çıkan veriyi sıralamadan önce TOP 100 kullanmak sorunu çözmüyor.

İşte önerilen düzenlenmiş sorgu:
SELECT TOP 100 
   T.STOK_ADI,
   T.STOK_KODU,
   SH.MIKTAR
FROM (
   SELECT 
       STOK_KODU,
       SUM(sthar_gcmik) AS MIKTAR 
   FROM tblsthar
   LEFT OUTER JOIN TBLCASABIT CS ON CS.CARI_KOD = tblsthar.STHAR_CARIKOD 
   WHERE STHAR_HTUR IN ('I', 'J', 'K') 
   AND sthar_gckod = 'C' 
   GROUP BY STOK_KODU
   ORDER BY MIKTAR DESC
) AS SH
INNER JOIN TBLSTSABIT T ON T.STOK_KODU = SH.STOK_KODU
ORDER BY SH.MIKTAR DESC;

DeepSeek
Tamam, kullanıcının SQL sorgusunda en çok satılan stok miktarını bulmaya çalıştığını ancak istediği raporu alamadığını söylüyor. Öncelikle, yazdığı sorguyu adım adım incelemem gerekiyor.

İlk olarak, kullanıcı iki alt sorgu (subquery) kullanmış: SH ve T. SH alt sorgusunda stok_kodu, CARI_KOD, CARI_ISIM ve toplam MIKTAR'ı hesaplamış. TBLSTHAR tablosunu TBLCASABIT ile LEFT JOIN yapmış. STHAR_HTUR değerleri I, J, K olan ve sthar_gckod='C' olan kayıtları seçmiş. Gruplama yaparken stok_kodu'na göre gruplamış, ancak CARI_KOD ve CARI_ISIM de eklemiş. Burada bir hata olabilir çünkü GROUP BY'da tüm non-aggregate sütunlar belirtilmeli. Yani stok_kodu, CARI_KOD, CARI_ISIM hepsi GROUP BY'da olmalı. Aksi takdirde hata alır. Ancak kullanıcının sorgusunda sadece stok_kodu gruplanmış. Bu muhtemelen bir hata kaynağı.

İkinci alt sorgu T'de ise TBLSTSABIT'ten stok_kodu ve stok_adi'yi grupluyor. Bu kısımda zaten stok_kodu unique olmalı, bu yüzden burada sorun yok.

Ana sorguda SH ve T'yi JOIN'liyor ama JOIN koşulunu belirtmemiş. Yani FROM içinde virgülle iki tablo yazılmış, bu CROSS JOIN anlamına gelir. Bu da tüm kombinasyonları getireceğinden yanlış sonuçlara sebep olur. SH ile T'yi stok_kodu üzerinden JOIN yapması gerekir. Ayrıca CARI_KOD ve CARI_ISIM'i SELECT'te kullanmış ama gruplamada eksiklik var. Ayrıca, TOP 100 kullanmış ama ORDER BY yapmamış. Ana sorguda ORDER BY olmadığı için en yüksek miktarlı kayıtları getirmeyebilir.

Çözüm için öncelikle SH alt sorgusunda GROUP BY'a CARI_KOD ve CARI_ISIM eklenmeli. Ama asıl amaç stok bazlı satış miktarı ise CARI_KOD ve CARI_ISIM'i sorgudan çıkarmak daha doğru olur. Çünkü stok başına toplam satış miktarı aranıyorsa, carileri dahil etmek veriyi carilerle birlikte gruplayarak stok kodunu unique yapmayacaktır. Yani her stok ve carinin kombinasyonu için toplam miktar hesaplanır. Bu durumda stok başına maksimum miktarı bulmak istiyorsak bu doğru olmaz.

Ayrıca, ana sorguda JOIN eksik. SH ve T tablolarını stok_kodu üzerinden birleştirmeli. CROSS JOIN yerine INNER JOIN kullanmalı ve ON ile şart belirtmeli.

Ayrıca, en yüksek miktarı bulmak için ORDER BY MIKTAR DESC ile sıralayıp TOP 1 almak gerekebilir. Ancak kullanıcı TOP 100 kullanmış, belki en çok satan 100 stok istiyor. Ancak SH alt sorgusunda order by yapılmış ama ana sorguda yapılmamış. Bu da doğru sıralamayı etkileyebilir.

Sonuç olarak, düzeltilmesi gereken noktalar:

1. SH alt sorgusundaki GROUP BY'a CARI_KOD ve CARI_ISIM eklenmeli veya bu sütunlar sorgudan çıkarılmalı. Eğer stok bazlı toplam isteniyorsa, CARI bilgileri sorguda olmamalı.

2. Ana sorguda SH ve T tabloları arasında stok_kodu üzerinden JOIN yapılmalı.

3. ORDER BY MIKTAR DESC ana sorguda olmalı, çünkü TOP 100 en yüksekleri almak için sıralama gerekli.

4. CARI_KOD ve CARI_ISIM SELECT'te kullanılıyorsa, GROUP BY'da da olmalı. Ama stok bazlı rapor isteniyorsa, muhtemelen bu sütunlar gereksiz.

Örnek düzeltilmiş sorgu şöyle olabilir:

Stok bazlı toplam miktarı hesaplamak için CARI bilgilerini çıkarıp, sadece stok_kodu'na göre gruplamak. Sonra T ile birleştirip, en yüksek miktarlı ilk 100 kaydı sıralamak.

SELECT TOP 100 
 T.STOK_ADI,
 T.STOK_KODU,
 SH.TOPLAM_MIKTAR
FROM 
 (SELECT 
    STOK_KODU, 
    SUM(sthar_gcmik) AS TOPLAM_MIKTAR 
  FROM tblsthar
  WHERE 
    STHAR_HTUR IN ('I','J','K') 
    AND sthar_gckod = 'C'
  GROUP BY STOK_KODU) AS SH
INNER JOIN 
 (SELECT 
    STOK_KODU, 
    STOK_ADI 
  FROM TBLSTSABIT) AS T 
 ON SH.STOK_KODU = T.STOK_KODU
ORDER BY SH.TOPLAM_MIKTAR DESC;

Yatırım tavsiyesi değildir Big Grin

Çok teşekkür ederim. Gerçekten hem hatalarımı hem de yapılması gerekenleri açıklamışsın , emeğine yüreğine sağlık kardeşim.
Cevapla
#4
@OZCANK  Rica ederim ama Jensen Huang'ın Nvidia H100 GPU larının da biraz katkısı var Smile
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  E-Fatura Seri Bulmak OZCANK 22 9.575 13-02-2023, Saat: 09:13
Son Yorum: OZCANK
  Memo1 deki kayıt sayısını bulmak. OZCANK 10 3.990 08-11-2021, Saat: 14:11
Son Yorum: OZCANK
  Run Time paneller oluşturmak ve drag-drop ile panelin kordinatlarını bulmak?(ÇÖZÜLDÜ) Hsavci 8 3.210 08-04-2021, Saat: 01:01
Son Yorum: Hsavci
  En Son Tarihi Bulmak OZCANK 0 1.311 09-03-2020, Saat: 07:16
Son Yorum: OZCANK
  Referans Gösteren Nesneyi Bulmak narkotik 4 4.501 24-04-2019, Saat: 19:38
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi