Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen neu84 »

Merhaba arkadaşlar,
Northwind veritabanında sorgu yazıyorum kendimi test etmek için, aklıma şöyle bi soru geldi.
Yıllara göre en çok satılan ürünleri Year, ProductName,MaxProductNumber olmak üzere listelemeyi deniyim dedim. Şu şekilde bir sorgu yazdım.

Kod: Tümünü seç

SELECT DATE_,MAX(PCOUNT) FROM 
(SELECT YEAR(O.OrderDate) AS DATE_,P.ProductName AS PRO,SUM(OD.Quantity) AS PCOUNT FROM Products P
	INNER JOIN [Order Details] OD ON OD.ProductID=P.ProductID	
	INNER JOIN [Orders] O ON O.OrderID=OD.OrderID
GROUP BY YEAR(O.OrderDate),P.ProductName
) TBL
GROUP BY DATE_
Sorgum çalışyor ve şu şekilde bir çıktı elde ediyorum.
1996 444
1997 971
1998 659
Ancak ProductName'i göstermek istediğimde group by a koymak zorunda kaldığım için bir sürü veri çıkıyor karşıma. ALL, ANY kullandım. HAVING SUM(OD.Quantity)>= ALL (yukarıdaki sorgunun alt sorgusunu buraya koydum) Ancak sadece 1 satır getirdi.

Bu soru için çözüm önerebilir misiniz?
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen neu84 »

Hala yardıma ihtiyacım var arkadaşlar.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen sabanakman »

Burada hangi ürün hangi yıl ne kadar satılmış listesine iki kere ihtiyaç duyulmaktadır. Birincisinde bu liste ile ilgili ProductID bilgisi ile ilişkilendirmede kullanılır ikincisinde ise en fazla satış rakamını bulmak için şart vermede kullanılır. Böyle bir durumda benim önerim geçici tablo ile kayıtları bir kere hesaplamak ve iki kere tekrar sorgu yazmamak olacak.

Kod: Tümünü seç

declare @tbl table(DATE_ int null, PCOUNT int null, ProductID int null)

insert into @tbl (DATE_, PCOUNT, ProductID)
select YEAR(O.OrderDate) as DATE_, SUM(OD.Quantity) AS PCOUNT, OD.ProductID from  [Orders] as O
inner join [Order Details] as OD on O.OrderID=OD.OrderID
GROUP BY YEAR(O.OrderDate), OD.ProductID
<--Hangi ürün hangi yıl ne kadar satılmış bilgisi @tbl geçici tablosundadır...

select P.ProductName, ana.* from @tbl as ana
inner join (select DATE_, MAX(PCOUNT) as PCOUNT from @tbl group by DATE_) as alt
on ana.DATE_=alt.DATE_ and ana.PCOUNT=alt.PCOUNT
left join Products as P on P.ProductID=ana.ProductID
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen neu84 »

sabanakman, cevabınız için çok teşekkür ederim. Günlerdir uğraşıyordum, bu şekilde düşünememiştim hiç. Sonuç oldukça başarılı ve kod oldukça anlaşılır. Tekrar teşekkürler.

Kodu inceleyince

Kod: Tümünü seç

on ana.DATE_=alt.DATE_ and ana.PCOUNT=alt.PCOUNT

satırının amacını anlamakta zorlandım. Neden her ikisine de bağlama zorunluluğu var. Sİlip tekrar teker denedim farkı gördüm ancak sebebini anlayamadım :)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen sabanakman »

on ana.DATE_=alt.DATE_ and ana.PCOUNT=alt.PCOUNT

Örnekteki alt sorgunun amacı o yıl en yüksek sayıya ulaşmış ürünlerin hangi yıl kaç adet olduğunun listesini elde etmektir ((select DATE_, MAX(PCOUNT) as PCOUNT from @tbl group by DATE_) as alt). Tabi bu miktarın daha sonra hangi ürüne ait olduğunu bulabilmek için listenin tekrar kendisiyle bu şartla ilişkilendirerek gerekli liste elde edilebilmektedir. Burada dikkat edilmesi gereken nokta en yüksek adet satıştan birden fazla ürün kaydı oluşursa bu kayıtların hepsi gelecektir ama örnekte böyle bir kayıt bulunmuyor o yüzden her yıl tek satır olarak geliyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Northwind'de bir sorgu yazdım. Ürün adını getiremiyorum.

Mesaj gönderen neu84 »

@sabanakman çok teşekkür ederim anlatım için. Bu bilgilere dayanarak yapamadığım bir kaç soruyu yapabildim. Bir soruda takıldım. müşteri isimlerine göre müşterilerin hiç almadıkları ürünleri gösteren bir sorgu yazmayı deniyorum inner joinlerle tüm müşterilerin aldıkları ürünleri listeleyebildim ancak tüm müşteri çok bi şekilde hiç almadıkları ürünleri bir listeleyemiyorum, dün sabahtan beri bunla uğraşıyorum, rica etsem bunun mantıgınıda anlatırmısınız bana?
Mevcut kodum şu şekilde;

Kod: Tümünü seç

DECLARE @TBL TABLE(CustomerID nvarchar(5),ContactName nvarchar(40),ProductID int)
INSERT INTO @TBL
SELECT C.CustomerID,C.ContactName,P.ProductID FROM Customers C 
	INNER JOIN Orders O ON O.CustomerID=C.CustomerID
	INNER JOIN [Order Details] OD ON OD.OrderID=O.OrderID
	LEFT JOIN Products P ON P.ProductID=OD.ProductID
--WHERE C.CustomerID='ALFKI'
GROUP BY C.CustomerID,C.ContactName,P.ProductID
--SELECT * FROM @TBL

Select * from @TBL AS ANA
	INNER JOIN (
					SELECT CustomerID,ContactName FROM @TBL
					GROUP BY CustomerID,ContactName
				) AS ALT
ON ANA.CustomerID=ALT.CustomerID AND ANA.ContactName=ALT.ContactName
INNER JOIN Products P ON ANA.ProductID=P.ProductID

---- üstteki kod yerine bunuda denedim ama yine sonuç alamadım. Ve tabi yaz sil yaz bir bir sürü şey denedim, geriye kalanlar bunlar oldu onlarca denemeden --sonra :
--Select CustomerID,ProductName from Products P INNER JOIN @TBL AS ANA ON P.ProductID=ANA.ProductID
--WHERE P.ProductID IN(Select DISTINCT ProductID From [Order DetailS] where CustomerID=ANA.CustomerID )
Bunun için bir öneride bulunabilir misiniz?
Cevapla