2016-04-06 20 views
0

Şu anda müşterilerin satış verilerini toplayan ve ay ve yıl olarak özetleyen bir SQL sorgum var. Yapmak istediğim bu verileri çeyrek olarak toplamak. Mevcut sorgu şu şekildedir. amaçlandığı gibiYıllık toplamlar içinde toplam değer

GROUP BY A.CustomerID, YEAR(B.TxnDate), QUARTER(B.TxnDate) ASC 

Bu işe yaramadı:

SELECT A.*, DATE_FORMAT(C.TxnDate, '%Y-%m') AS FormattedTxnDate, SUM(C.Quantity * D.TotalCost) AS COGS, SUM(C.Quantity * C.Amount) AS Revenue 
FROM customer_info A, invoices B, invoice_lines C, inventory D 
WHERE A.CustomerID = B.CustomerID 
AND B.TxnID = C.TxnID 
AND C.ItemID = D.ID 
AND B.TxnDate BETWEEN '2013-04-01' AND '2016-04-06' 
GROUP BY A.CustomerID, YEAR(B.TxnDate), MONTH(B.TxnDate) ASC 

Ben sorguda son satırı değiştirmeye çalışmıştır. Aynı çeyrek içerisindeki değerler toplanmasına rağmen, sonuçta FormattedTxnDate, satış bilgilerinin bulunduğu belirli bir çeyreğin ilk ayını kullanmaktadır (çünkü söz konusu müşteri, ilk ay boyunca, FT2 ayının anlamı olan, Q2'nin Nisan ayı gibi bir şey satın almamış olabilir. Mayıs olur. DATE_FORMAT'ı ay yerine çeyrek göstermek için kullanmanın bir yolu var mı? Bir %q seçeneği olabileceğini düşündüm ama yanılmışım. Biçimlendirilmiş tarihlerle çalışmanın OLABİLECEĞİNİ unutmamalıyım, ancak daha basit ve daha rahatsız edici olabilirdim.

cevap

0

İki GROUP-BY, diğerinin içinde yapın.

select [list attributes of A], year, quarter, sum(revenue) as revenue from 
    (SELECT A.*, 
      DATE_FORMAT(C.TxnDate, '%Y-%m') AS FormattedTxnDate, 
      SUM(C.Quantity * D.TotalCost) AS COGS, 
      SUM(C.Quantity * C.Amount) AS Revenue, 
      YEAR(B.TxnDate) as year, 
      QUARTER(B.TxnDate) as quarter 
    FROM customer_info A, invoices B, invoice_lines C, inventory D 
     WHERE A.CustomerID = B.CustomerID 
     AND B.TxnID = C.TxnID 
     AND C.ItemID = D.ID 
     AND B.TxnDate BETWEEN '2013-04-01' AND '2016-04-06' 
    GROUP BY A.CustomerID, YEAR(B.TxnDate), MONTH(B.TxnDate)) as RIP 
    GROUP BY [list all attributes of A], year, quarter 

Şahsen ben ilk gruplama ölçütleri yapacağını ve daha sonra müşteri ile katılmak: Bu, fikir verecektir.

Başka bir seçenek ise: Orijinal sorguya çeyrek ekleyerek B'nin bir alt sorgu yapmak bölümünden: GELEN ...

, Faturalar B ...

FROM ..., (select *, quarter(txndate) as quarter From Invoices) as B 
için

o zaman mutlu bir şekilde GROUP Orijinal sorgunuzdaki çeyrekte

+0

İkinci seçeneği denedim. Işe yaramadı. Öncelikle, son kod örneğinizi 'faturalar B' yerine sorguya yerleştirmeyi denedim ancak daha önce yaptığım sonuçları aldım. Daha sonra, 'B.TxnDate' değerini "B.Quarter" olarak değiştirerek, değerlerin kendiliğinden çözülmesini sağlayan bir değişiklik yaptım. Bence şimdi bu değişim ile belirli bir yıllık süre içinde her şeyi toplamalıyor. – user3521737

+0

grubu ile değiştirdiniz: GROUP BY A.CustomerID, YEAR (B.TxnDate), çeyrek ASC – dmg

+0

Şimdi bunu denedim ancak FormattedTxnDate hala bana çeyrek vermiyor. Sadece çeyreğin ilk kullanılabilir yılını ve ayını gösterir. – user3521737