SQL() yan tümcesi - ne zaman ve neden yararlıdır?
USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
O maddeyi okudum ve bu yüzden ihtiyacım var anlamıyorum.
Fonksiyonu Over
ne yapar? Partitioning By
ne yapar?
Neden ben Group By SalesOrderID
yazma ile bir sorgu yapabilir mi?
CEVAP
SanaolabilirGROUP BY SalesOrderID
kullanın. Bu fark, GRUP ile sadece GRUBA dahil olmayan sütunlar için toplanan değerleri olabilir.
Buna karşılık, GRUP TARAFINDAN yerine pencereli toplama işlevlerini kullanarak, toplu ve dışı toplanan her iki değer alabilir. O, örnek sorguda bunu yapmıyorsun rağmen, OrderQty
değerleri ve toplamları, sayıları, ortalamalar vb hem tek tek alabilir. SalesOrderID
ler aynı. gruplar üzerinde
İşte pencereli toplayan büyük neden pratik bir örnek. Her değer ne olduğunu hesaplamak gerekir sanırım. İlk toplanan değerler listesi türetmek ve orijinal satır geri katılması gerekirdi pencereli toplamları olmadan, yani bu gibi:
SELECT
orig.[Partition],
orig.Value,
orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
INNER JOIN (
SELECT
[Partition],
SUM(Value) AS TotalValue
FROM OriginalRowset
GROUP BY [Partition]
) agg ON orig.[Partition] = agg.[Partition]
Pencereli bir toplama ile aynı şeyi nasıl şimdi bak:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Çok daha kolay ve daha temiz, değil mi?
Neden orada VARSAYILAN tümcesi CURRENT...
Yansıma nedir ve neden yararlıdır?...
Neden önemli GetHashCode yöntem geçers...
Neden benim program tam olarak 8192 el...
Bir kendisine dahil ederse, ne olduğun...