Forum
Merhabalar,
İki adet mevcut tablom var
1.Tablom stoklarımın Satış fiyatlarını belirlediğim tablom;
SELECT SUBE_KODU,STOKKODU,FIYAT1,FIYAT2,BASTAR FROM TBLSTOKFIAT WHERE A_S = 'S' and BASTAR = CONVERT(DATE,'05.03.2025',104)
2.Tablom Her Şubenin fiyat etiketi çıkarırken log tuttuğu tablo;
SELECT STOK_KODU,STOK_ADI,SUBE_KODU,TIP,ETK_BASIM_TARIHI FROM TBLETIKETLOG WHERE CONVERT(DATE,ETK_BASIM_TARIHI,104) = CONVERT(DATE,'05.03.2025',104)
TBLSTOKFIAT tablosunda SUBE KODU alanı var fakat her stok için -1 olarak değeri var
TBLETIKETLOG tablosunda hangi şube etiket basmış ise o şubenin kodu var
Şube Etiket basımı yaparken 1 gün önceden basım yapabiliyor
Yani TBLSTOKFIAT tablosunda 86908528 kodlu stok BASTAR = 05.03.2025 iken,
Şube, bu stoğun etiketini 05.03.2025 veya 04.03.2025 tarihinde çıkarmış olabilir.
Yani ETK_BASIM_TARIHI = 05.03.2025 veya ETK_BASIM_TARIHI = 04.03.2025 olabiliyor.
İstediğim Ekteki resim gibi İki tabloyu birleştirip Hangi şubemin etiketi basıp basmadığını kontrol etmek
İyi çalışmalar Dilerim..
Merhaba, aşağıdaki kodu dener misiniz?
-- Tüm şubelerin listesi alınır (örneğin TBLSUBELER tablosundan ya da LOG tablosundan distinct SUBE_KODU ile)
WITH SUBELER AS (
SELECT DISTINCT SUBE_KODU FROM TBLETIKETLOG
),
-- Etiket basımı gereken stoklar ve tarihleri
STOK_FIYATLARI AS (
SELECT
f.STOKKODU,
s.SUBE_KODU,
f.FIYAT1,
f.FIYAT2,
f.BASTAR
FROM TBLSTOKFIAT f
CROSS JOIN SUBELER s
WHERE f.A_S = 'S' AND f.BASTAR = CONVERT(DATE, '05.03.2025', 104)
),
-- Gerçekleşen etiket basımları (1 gün önceden veya aynı gün)
ETIKET_BASIMLARI AS (
SELECT
STOK_KODU,
SUBE_KODU,
ETK_BASIM_TARIHI
FROM TBLETIKETLOG
WHERE CONVERT(DATE, ETK_BASIM_TARIHI, 104) BETWEEN DATEADD(DAY, -1, CONVERT(DATE, '05.03.2025', 104)) AND CONVERT(DATE, '05.03.2025', 104)
)
-- Sonuçları birleştirip etiketi basılmış mı kontrol edilir
SELECT
sf.SUBE_KODU,
sf.STOKKODU,
sf.FIYAT1,
sf.FIYAT2,
sf.BASTAR,
eb.ETK_BASIM_TARIHI,
CASE
WHEN eb.ETK_BASIM_TARIHI IS NOT NULL THEN 'Etiket Basılmış'
ELSE 'Etiket Basılmamış'
END AS DURUM
FROM STOK_FIYATLARI sf
Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************
Hakan Bey hızlı cevap için çok teşekkür ederim
Fakat;
eb.ETK_BASIM_TARIHI
eb'i nereye tanımlayacağımı bulamadım.
Merhabalar,
WITH SUBELER AS (
SELECT DISTINCT SUBE_KODU FROM TBLETIKETLOG
),
STOK_FIYATLARI AS (
SELECT
f.STOKKODU,
f.FIYAT1,
f.FIYAT2,
f.BASTAR
FROM TBLSTOKFIAT f
WHERE f.A_S = 'S' AND f.BASTAR = CONVERT(DATE, '05.03.2025', 104)
),
ETIKET_BASIMLARI AS (
SELECT
STOK_KODU,
SUBE_KODU,
ETK_BASIM_TARIHI,
STOK_ADI
FROM TBLETIKETLOG
WHERE CONVERT(DATE, ETK_BASIM_TARIHI, 104) BETWEEN DATEADD(DAY, -1, CONVERT(DATE, '05.03.2025', 104)) AND CONVERT(DATE, '05.03.2025', 104)
)
SELECT
eb.SUBE_KODU,
sf.STOKKODU,
eb.STOK_ADI,
sf.FIYAT1,
sf.FIYAT2,
sf.BASTAR,
eb.ETK_BASIM_TARIHI,
CASE WHEN CONVERT(DATE, eb.ETK_BASIM_TARIHI, 104)<sf.BASTAR THEN '1 Gün Önce Basılmış'
when CONVERT(DATE, eb.ETK_BASIM_TARIHI, 104)=sf.BASTAR THEN 'Etiket Basılmış'
ELSE 'Etiket Basılmamış'
END AS DURUM
FROM STOK_FIYATLARI sf
JOIN ETIKET_BASIMLARI eb on eb.STOK_KODU = sf.STOKKODU
order by eb.SUBE_KODU
bu şekilde etiket basanlar ve 1 gün önce basanlar çıkıyor,
Fakat etiket basmayanlar gelmiyor.
Ben daha basit (anladığım kadarıyla) önereceğim. 2 tabloyu birleştimek için JOIN kullanabilirsin. Ortaokul matematik kümeler konusu gibi düşünün. TBLSTOKFIAT tablonuzdaki tüm veriler gelecek ancak TBLETIKETLOG tablosunda sadece eşleştiği bilgiler gelecek.
SELECT stok.sube, stok.stokkod, stok.tarih, log.basimtarih
FROM TBLSTOKFIAT stok
LEFT JOIN TBLETIKETLOG log
ON stok.sube=log.sube
AND stok.stokkod=log.stokkod
AND blabla.....(bu kısımda iki tablonuz aranızdaki ilişkiye göre eşleşme yapmalısınız.
WHERE stok.sube='SubeKodu'
AND stok.stokkod='abcd'
Sorguyu kendi tablo yapınıza göre düzenleyin. LEFT JOIN kullandığımız için TBLSTOKFIAT tablosundaki tüm veriler gelecek, ancak log tablosunda eşleşme olmazsa log.basimtarih alanı NULL dönecek. CASE yapısı ile bu değerin gösterimini de özelleştirebilirsiniz.
Bu arada chatgpt bu tip basit sorgular konusunda eğitici bir destek sunar ancak takılırsanız yine de belirtin yardımcı olmaya çalışalım.
Serkan bey,
Durumu şöyle anlatayım
Şube kodu alanı olan fakat bütün değerleri -1 olan fiyat tablom var
birde 40 adet şube olan bir log tablom var
Örneğin
X kodlu ürün fiyat tablosunda 1 adet kayıt ve şube kodu alanı değeri -1 iken
Log tablosunda 30 adet X kodlu ürün var ve her bir şubenin kodu da SUBE_KODU alanında mevcut
Çünkü şubelerim Fiyat tablosunda ürünü seçmiş etiketini basmış ve şube kodu ile beraber log tablosuna yazmış.
10 şubede de etiket basımı yapılmadığından log tablosunda o güne ait kayıtlarda yok
yani şubeleri JOIN ile ortak yapamam.
Cevaplarken anladığım kadarıyla demiştim. Eksik kalmış olabilir. Dürüst olmak gerekirse son yazdığınızı da anladığım kadarıyla yanıtlayacağım.
Aşağıdaki sorguyu kontrol edip sonucunu yazın lütfen. Sorgu TBLSTOKFIAT tablonuzdaki tüm kayıtları çağırır, TBLETIKETLOG tablosuna bağlanarak SUBE_KODU ve ETK_BASIM_TARIHI alanlarını sonuca ekler. Böylece stoklarınıza ait hangi şubede etiket çıktısı alınıp alınmadığını raporlayabilirsiniz. Etiket çıktısı alan şubelerde ETK_BASIM_TARIHI görüntülenir. Etiket çıktısı almamış şubelerin ETK_BASIM_TARIHI NULL döner. CASE yapıları ile sorgu sonucunuzu detaylandırabilirsiniz.
SELECT
log.SUBE_KODU,
fyt.STOKKODU,
fyt.FIYAT1,
fyt.FIYAT2,
fyt.BASTAR,
log.ETK_BASIM_TARIHI
FROM TBLSTOKFIAT fyt
LEFT JOIN TBLETIKETLOG log
ON fty.STOKKODU=log.STOK_KODU