Forum
Arkadaşlar hayırlı akşamlar.
4 gündür bir sorgu üzerinde çalışıyorum ama zamanım kalmadığından çözemeyeceğim sanırım. 3 Tablo birbirine bağlı ve çıkan sonuçtan her depodan
USE MASTER
GO
CREATE TABLE [dbo].[Stoklar](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StokID] [int] NOT NULL,
[Kod] [nvarchar](20) NOT NULL,
[Adi] [nvarchar](100) NOT NULL
) ON [PRIMARY]
GO
INSERT INTO dbo.Stoklar(StokID,Kod,Adi)values(1,N'Kod-1',N'Ürün Adı 1')
INSERT INTO dbo.Stoklar(StokID,Kod,Adi)values(2,N'Kod-2',N'Ürün Adı 2')
INSERT INTO dbo.Stoklar(StokID,Kod,Adi)values(3,N'Kod-3',N'Ürün Adı 3')
INSERT INTO dbo.Stoklar(StokID,Kod,Adi)values(4,N'Kod-4',N'Ürün Adı 4')
CREATE TABLE [dbo].[AltStoklar](
[AltStokID] [int] IDENTITY(1,1) NOT NULL,
[StokID] [int] NOT NULL,
[DepoAdi] [nvarchar](20) NOT NULL,
[BirimAdi] [nvarchar](10) NOT NULL,
[Miktar] [float] NOT NULL,
) ON [PRIMARY]
GO
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(1,N'Kartal',N'Kilo',5)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(1,N'Kartal',N'Çuval',25)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(2,N'Pendik',N'Adet',1)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(2,N'Pendik',N'Paket',10)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(2,N'Pendik',N'Koli',4)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(3,N'Kadıköy',N'Adet',4)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(3,N'Kadıköy',N'Paket',4)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(3,N'Kadıköy',N'Koli',4)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(3,N'Kadıköy',N'Palet',4)
INSERT INTO dbo.AltStoklar(StokID,DepoAdi,BirimAdi,Miktar)values(4,N'Bostancı',N'Adet',4)
CREATE TABLE [dbo].[Fiyatlar](
[FiyatID] [int] IDENTITY(1,1) NOT NULL,
[AltStokID] [int] NOT NULL,
[Fiyat] [smallmoney] NOT NULL,
[ParaBirimi] [nvarchar](5) NOT NULL
) ON [PRIMARY]
GO
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(1,10,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(1,20,N'USD')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(1,60,N'EUR')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(2,40,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(2,24,N'USD')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(3,90,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(4,70,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(5,80,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(6,90,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(7,100,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(8,110,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(9,40,N'TL')
INSERT INTO dbo.Fiyatlar(AltStokID,Fiyat,ParaBirimi)values(10,70,N'TL')
select
TabloB.AltStokID,
TabloA.Kod,
TabloA.Adi,
TabloB.DepoAdi,
TabloB.BirimAdi,
TabloB.Miktar,
TabloC.Fiyat
from
dbo.Stoklar as TabloA
inner join dbo.AltStoklar as TabloB ON TabloB.StokID=TabloA.StokID
inner join dbo.Fiyatlar as TabloC ON TabloC.AltStokID=TabloB.AltStokID
ORDER BY
TabloB.Miktar desc
GO
DROP TABLE [dbo].[Stoklar]
GO
DROP TABLE [dbo].[AltStoklar]
GO
DROP TABLE [dbo].[Fiyatlar]
GO
Mavi renkli satırlar sonuç olarak almalıyım. Nasıl bir yöntem izlemeliyim ?
Edit : Yalnız tablodaki kolon başlıklarım aynen olacak.
Değerli arkadaşlar henüz bir sonuç üretememiş bulunmaktayım.
Forumdaki Tüm benzer SQL konularını inceledim. Fakat çözüm çözüm çözüm yok.
Yardımlarınızı bekliyorum.
Merhaba Yavuz bey;
Evet birşeyler denemiştim ROW_NUMBER ile fakat istediğim sonucu alamamıştım. PARTITION, RANK, vb. şeyleri de inceledim olmadı. Çözüm Park Forum'da benzer makalelere rastladım ama Otomatik Sayı alanının içerisinden yukarıdaki caps şeklinde bir sonuç döndüremedim. Denemediğim şey kalmadı. Son çare olarak buraya yazdım. Arama motorlarının sonucuna da ulaşamadım.
Yukarıdaki tablom sadece bir örnek. joinle bağladığım yerler aslında int alan. Anlaşılsın diye öyle yazmıştım. Yaklaşık 30.000.000 satırlı bir join bu.
Fonksiyonlar yazarak istediğim sonuçları alıyorum fakat performans ölüyor.
Bir taraftan denemelerim devam ediyor. Açıkcası ne yapacağımıda bilemiyorum. Gereksiz selectler yada joinler kullanmadan çözmeye çalışıyorum.
Küçük bir örnek sunmanız mümkünmüdür. En azından sizden esinlenerek geliştirebilirim diye düşünüyorum.
Cevabınız için teşekkürler.
Yavuz bey zaten proc içerisinde 2-3 parametre ile sorguluyorum. Where şartlarım var ve offset ile sayfalama yapıyorum. İlgili indexler de var. Bunlardada sorunum yok. Sorunum sadece SQL sorgusunda. İstemediğim satırlar gelmemesi lazım.
Yani makalemi ilk açtığımda istediğim sonuç şu: Her depodan en çok olan ürün ve o ürüne ait fiyatın gelmesi.
Yani mavi renkli satırların gelmesi lazım. Yukarda örnek verdiğim kodlar sadece anlaşılması açısındandı.
Merhaba,
select Max(Fiyat) from TABLO group by DepoAdi şeklinde mysql üzerinden benzer bir sonuç üretilebiliyor. Sql server üzerinde de deneyebilirsiniz.
Merhaba,
select Max(Fiyat) from TABLO group by DepoAdi şeklinde mysql üzerinden benzer bir sonuç üretilebiliyor. Sql server üzerinde de deneyebilirsiniz.
Sevgili Yasincim;
Yukarıdaki görüntüde benim esas istediğim aslında AltStokID 'dir. MAX ile olmaz istediğim. Dönen sonuç çoğalan bir otomatik sayı alanıdır. Daha önce karşıma hiç böyle bir durum çıkmadı. O yüzden çözümünde bayağı bir zorlanıyorum.
Cevabın için teşekkür ederim.
Bu çözümü bulsam bulsam çözüm park'ta bulabilirim. Başka biryerde bulacağımı sanmıyorum. Bulursamda paylaşacağım. Bu konuda Sıkıntı çeken herkeze bir ışık olacaktır.
Saygı ve sevgilerimle
Merhaba,
Her Depodaki en çok bulunan ürünlerin mi listelenmesini istiyorsunuz?
Ayrıca aşağıdaki sorguyuda deneyebilirsiniz.
select * from (
select
TabloB.AltStokID,
TabloA.Kod,
TabloA.Adi,
TabloB.DepoAdi,
TabloB.BirimAdi,
TabloB.Miktar,
TabloC.Fiyat,
Row_number() over(partition by TabloB.DepoAdi order by TabloB.Miktar desc) as s
from
dbo.Stoklar as TabloA
inner join dbo.AltStoklar as TabloB ON TabloB.StokID=TabloA.StokID
inner join dbo.Fiyatlar as TabloC ON TabloC.AltStokID=TabloB.AltStokID
) k where s=1
Merhaba,
Her Depodaki en çok bulunan ürünlerin mi listelenmesini istiyorsunuz?
Ayrıca aşağıdaki sorguyuda deneyebilirsiniz.
select * from (
select
TabloB.AltStokID,
TabloA.Kod,
TabloA.Adi,
TabloB.DepoAdi,
TabloB.BirimAdi,
TabloB.Miktar,
TabloC.Fiyat,
Row_number() over(partition by TabloB.DepoAdi order by TabloB.Miktar desc) as s
from
dbo.Stoklar as TabloA
inner join dbo.AltStoklar as TabloB ON TabloB.StokID=TabloA.StokID
inner join dbo.Fiyatlar as TabloC ON TabloC.AltStokID=TabloB.AltStokID
) k where s=1
İsmail bey harikasınız. Bu kodun aynısını ben denemiştim fakat partition by depo adından sonra birim adınıda ilave etmiştim. Hiç düşünememişimsadece DepoAdi kullanmayı.
Yapılabildiğini biliyorum ama artık bana imkansız gibi gelmeye başlamıştı.
Çok sağolun. Allahta sizin sıkıntınızı gidersin İnşallah.
Saygı ve sevgilerimle
Merhaba,
Her Depodaki en çok bulunan ürünlerin mi listelenmesini istiyorsunuz?
Ayrıca aşağıdaki sorguyuda deneyebilirsiniz.
select * from (
select
TabloB.AltStokID,
TabloA.Kod,
TabloA.Adi,
TabloB.DepoAdi,
TabloB.BirimAdi,
TabloB.Miktar,
TabloC.Fiyat,
Row_number() over(partition by TabloB.DepoAdi order by TabloB.Miktar desc) as s
from
dbo.Stoklar as TabloA
inner join dbo.AltStoklar as TabloB ON TabloB.StokID=TabloA.StokID
inner join dbo.Fiyatlar as TabloC ON TabloC.AltStokID=TabloB.AltStokID
) k where s=1
Ben 1 kere daha teşekkür etmek istiyorum 🙂
Çok sağolun.