Forum

Her depodan miktarı...
 
Bildirimler
Hepsini Temizle

Her depodan miktarı en çok olan ürün bilgileri

ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

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

 

Sorgu Ekranı

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.

Alıntı
Konu başlatıcı Gönderildi : 01/12/2016 23:34
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

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.

CevapAlıntı
Konu başlatıcı Gönderildi : 03/12/2016 07:07
oldmember
(@yavuzfilizlibay)
Üye

Merhaba

Row number fonksiyonu ile denediniz mi

CevapAlıntı
Gönderildi : 03/12/2016 14:54
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

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.

 

 

CevapAlıntı
Konu başlatıcı Gönderildi : 03/12/2016 18:10
oldmember
(@yavuzfilizlibay)
Üye

Performanslı olması açısından, stored procedure de bunu denemeniz iyi olur, değişkenler atayarak alırsanız daha iyi çalışır, gereksiz yere bu sorgu için execution planlar oluşturmaz, parametrik olacağı için her zaman aynı planı kullanır, denemenizi öneririm. 30 milyon kayıt ciddi bir rakam, bu tablolara indeks atmanız gerekebilir, sorguya indekslerini de kontrol edin.

CevapAlıntı
Gönderildi : 03/12/2016 21:05
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

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. 

 

Stok Listesi

 

Yani mavi renkli satırların gelmesi lazım. Yukarda örnek verdiğim kodlar sadece anlaşılması açısındandı.

CevapAlıntı
Konu başlatıcı Gönderildi : 03/12/2016 21:47
Yasin Ergene
(@YasinErgene)
Üye

Merhaba,

select Max(Fiyat) from TABLO group by DepoAdi şeklinde mysql üzerinden benzer bir sonuç üretilebiliyor. Sql server üzerinde de deneyebilirsiniz.

CevapAlıntı
Gönderildi : 04/12/2016 01:07
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

[quote user="Yasin Ergene"]

Merhaba,

select Max(Fiyat) from TABLO group by DepoAdi şeklinde mysql üzerinden benzer bir sonuç üretilebiliyor. Sql server üzerinde de deneyebilirsiniz.

[/quote]

 

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

CevapAlıntı
Konu başlatıcı Gönderildi : 04/12/2016 20:38
İsmail ADAR
(@ismailadar)
Üye

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

CevapAlıntı
Gönderildi : 05/12/2016 17:11
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

[quote user="İsmail ADAR"]

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

[/quote]

İ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

CevapAlıntı
Konu başlatıcı Gönderildi : 05/12/2016 18:37
ilker ARSLANTÜRK
(@ilkerARSLANTURK)
Üye

[quote user="İsmail ADAR"]

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

[/quote]

 

Ben 1 kere daha teşekkür etmek istiyorum 🙂

Çok sağolun.

CevapAlıntı
Konu başlatıcı Gönderildi : 05/12/2016 18:53
Paylaş: