5

Üç tabloya katılmak ve Tablo A'nın Toplamını (Miktar) hesaplamak istiyorum. Bir şey denedim ve istenen çıktıyı alıyorum. Ama yine de toplu işlev ve Group By yan tümcesine dayalı karışıklık var.Birleştirmelerde Toplama işlevini kullandığımızda Group By cümlesi nasıl kullanılır?

İki veya daha fazla tabloya katılarak toplam değeri hesaplarken, Group By deyiminde belirtmemiz gereken sütunlar nelerdir ve neden bu sütunları vermemiz gerekiyor?

Örnek: İşte benim masam ve istenen sorgu.

TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity 
TableB: ItemID, ItemName, SpecificationID 
TableC: SpecificationID, SpecificationName 
TableD: DivisionID, DivisionName 
TableE: JobOrderID, JobOrderNo. 
TableF: CustomerID, CustomerName 

Ben ItemID, CustomerID, JobOrderID ve DivisionID dayalı toplam (Miktar) almak istiyorum.

Aşağıdaki sorguyu yazdım ve iyi çalışıyor. Ancak Group By ifadesinde herhangi bir sütunu kaldırırsam, istenen sonucu vermez. Niye ya? Group By cümlesi burada ne yapıyor? Toplama işlevini kullanırken Group By cümlesi nasıl belirlenir? İşte benim Sorgum.

SELECT 
      B.ItemName + ' - ' + C.SpecificationName AS 'ItemName', 
      SUM(A.Quantity) AS 'Quantity', 
      A.ItemID, 
      D.DivisionName, 
      F.CustomerName, 
      E.JobOrderNo, 
      A.DivisionID, 
      A.JobOrderID, 
      A.CustomerID 

    FROM 
      TableA A 
      INNER JOIN TableB B ON B.ItemID = A.ItemID 
      INNER JOIN TableC C ON C.SpecificationID = B.SpecificationID 
      INNER JOIN TableD D ON D.DivisionID = A.DivisionID 
      LEFT JOIN TableE E ON E.JobOrderID = A.JobOrderID 
      LEFT JOIN TableF F ON F.CustomerID = A.CustomerID 
    WHERE 
      A.ItemID = @ItemID 
    GROUP BY 
      A.ItemID, 
      A.JobOrderID, 
      A.DivisionID, 
      A.CustomerID, 
      D.DivisionName, 
      F.CustomerName, 
      E.JobOrderNo, 
      B.ItemName, 
      C.SpecificationName 

Herhangi biri, lütfen bir örnek olarak Group By Clause hakkında öneri sunun.

cevap

4

GROUP BY (min vb toplamı gibi) ile ilişkili toplanmayı yapar. GROUP BY yan tümcesinde veya toplama işlevinde bir sütun adı belirtmezseniz, SQL motoru için bilinmeyen bir değer bu tür bir sütun için döndürmelidir.

+0

Bazı sütunlar seçersek, bu sütunları Group By cümlesine de vermeliyiz. Öyle mi? – thevan

+0

Evet, seçili sütun, "grup by" şeklinde veya şu gibi bir şekilde olmalıdır: "select max (column_name)" –

5

GROUP BY (Transact-SQL), seçili satır kümelerini SQL Server 2008 R2'deki bir veya daha fazla sütunun veya ifadenin değerleriyle bir özet satır kümesine gruplandırır. Her grup için bir satır iade edilir. SELECT yan tümce listesinde toplanan işlevler, tek tek satırlar yerine her grup hakkında bilgi sağlar. BY yan tümcesinde

SELECT a.City, COUNT(bea.AddressID) AS EmployeeCount 
FROM Person.BusinessEntityAddress AS bea 
    INNER JOIN Person.Address AS a 
     ON bea.AddressID = a.AddressID 
GROUP BY a.City 

GRUP bir ISO uyumlu sözdizimi ve olmayan ISO uyumlu sözdizimi vardır. Tek bir sözdizimi stili, tek bir SELECT deyiminde kullanılabilir. Tüm yeni işler için ISO uyumlu sözdizimini kullanın. Geriye dönük uyumluluk için ISO olmayan uyumlu sözdizimi sağlanır.

ISO uyumlu sözdiziminde listesinde herhangi bir nonaggregate ifade her bir tablo veya görünüm kolon GROUP BY listesine dahil edilmesi gerekir.

select pub_id, type, avg(price), sum(total_sales) 
from titles 
group by pub_id, type 

Organizing query results into groups: the group by clause

Sybase veya olmayan ISO uyumlu sözdizimine atıfta bulunularak Eğer eklemek veya select listeye group by içeren bir sorgunun içinde atlayabilirsiniz ne kısıtlamalarını kaldırdı:

  • Seçme listesindeki sütunlar gruplama sütunlarıyla ve vektörleri ile kullanılan sütunlarla sınırlı değildir.

  • Grup tarafından belirtilen sütunlar, seçim listesindeki toplu olmayan sütunları ile sınırlı değildir.

Örnek: Belirtilen sütun herhangi bir benzersiz kombinasyonu için

select type, title_id, avg(price), avg(advance) 
from titles 
group by type 
+0

bazı sütunlar anlamına seçerseniz Yani, biz de maddesinde Grup bu sütunları vermek gerekir. Öyle mi? – thevan

+0

@thevan: Cevabımı düzenledim .. –

+0

bu çok daha anlamlı, grup sadece grup için reprendentative bir satır göstererek grup oluşturuyor, bu nedenle tüm birleşik olmayan alanlar, tümceye göre gruba dahil edilmelidir. –

2

Grup olmadan toplam gibi toplama işlevlerini kullanmak için, yukarıdaki maddeyi kullanın.

Bkz: http://msdn.microsoft.com/en-us/library/ms189461.aspx

Örnek:

CREATE TABLE #a (ida int, name varchar(50)) 
CREATE TABLE #b (ida int, number int) 

INSERT INTO #a VALUES(1,'one') 
INSERT INTO #a VALUES(2,'two') 

INSERT INTO #b VALUES(1,2) 
INSERT INTO #b VALUES(1,3) 
INSERT INTO #b VALUES(2,1) 

SELECT DISTINCT a.ida, sum(number) OVER (PARTITION BY a.ida) FROM #a a 
INNER JOIN #b b on a.ida = b.ida