SORU
2 HAZİRAN 2011, PERŞEMBE


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
2 HAZİRAN 2011, PERŞEMBE


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. SalesOrderIDler 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?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006
  • Living Waters

    Living Water

    9 AĞUSTOS 2006
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009