SORU
19 Kasım 2009, PERŞEMBE


MySQL: bir Dönen birden çok sütun-satır alt sorgu

Satış aylık özet bir ay döndüren bir SQL deyimi yaratıyorum.

Özet tarih için bazı basit sütunlar, satış sayısı ve satış toplam değeri listeler.

Ancak, bu sütunlar ek olarak, miktar ayda en iyi müşteri listesi 3 Daha geçirdi eklemek istiyorum. Bu sütunlar için, KİMLİĞİ, Adı ve harcanan Miktar döndüren alt sorgu, satır içi bir tür istiyorum.

Benim şimdiki çaba SELECT satır içi bir deyim kullanır, ancak bu uygulama konusunda bilgimle, sadece satırı deyimi başına bir sütun ve satır iade edebilirsiniz.

Benim senaryo ile bunu çözmek için, tabii ki in-line ifadeler 3 ayrı, ancak bu görünen pratik hem yaratabilirim, sorgu süresi fazla gerekli olduğunu arttırır.

SELECT  
    DATE_FORMAT(OrderDate,'%M %Y') AS OrderMonth,
    COUNT(OrderID) AS TotalOrders, 
    SUM(OrderTotal) AS TotalAmount, 

    (SELECT SUM(OrderTotal) FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS TotalCustomerAmount,

    (SELECT OrderCustomerFK FROM Orders WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerID,

    (SELECT CustomerName FROM Orders INNER JOIN Customers ON OrderCustomerFK = CustomerID WHERE DATE_FORMAT(OrderDate,'%M %Y') = OrderMonth GROUP BY OrderCustomerFK ORDER BY SUM(OrderTotal) DESC LIMIT 1) AS CustomerName

FROM Orders     
GROUP BY DATE_FORMAT(OrderDate,'%m%y')
ORDER BY DATE_FORMAT(OrderDate,'%y%m') DESC

Nasıl daha iyi bu sorgu yapısı miyim?


TAM CEVAP

Dave Barkers bazı verdiği sonra çözüm, gelecek yardım için arayan herkes için son bir sürüm var.

Dave Barker tarafından çözüm mükemmel müşteri detayları ile birlikte çalıştı, daha basit Toplam Satış ve Toplam Satış Miktarı sütun çılgın rakamlar elde etti.

SELECT  
        Y.OrderMonth, 	Y.TotalOrders,	Y.TotalAmount,
        Z.OrdCustFK,  Z.CustCompany, 	Z.CustOrdTotal, Z.CustSalesTotal   


 FROM 
    	(SELECT
    		OrdDate,
    		DATE_FORMAT(OrdDate,'%M %Y') AS OrderMonth, 
    		COUNT(OrderID) AS TotalOrders, 
    		SUM(OrdGrandTotal) AS TotalAmount
    		FROM Orders
    		WHERE OrdConfirmed = 1    
    		GROUP BY DATE_FORMAT(OrdDate,'%m%y') 
    		ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC)
    Y INNER JOIN 
    	(SELECT 
    		DATE_FORMAT(OrdDate,'%M %Y') AS CustMonth, 
    		OrdCustFK, 
    		CustCompany, 
    		COUNT(OrderID) AS CustOrdTotal,
    		SUM(OrdGrandTotal) AS CustSalesTotal 
    	FROM Orders INNER JOIN CustomerDetails ON OrdCustFK = CustomerID
    	WHERE OrdConfirmed = 1
    	GROUP BY DATE_FORMAT(OrdDate,'%m%y'), OrdCustFK 
    	ORDER BY SUM(OrdGrandTotal) DESC) 
    Z ON Z.CustMonth = Y.OrderMonth

GROUP BY DATE_FORMAT(OrdDate,'%Y%m')
ORDER BY DATE_FORMAT(OrdDate,'%Y%m') DESC

CEVAP
19 Kasım 2009, PERŞEMBE


Inline SQL katılın içsel bir sorgu devam eder. Gibi bir şey olurdu

SELECT  DATE_FORMAT(OrderDate,'%M %Y') AS OrderMonth, COUNT(OrderID) AS TotalOrders, SUM(OrderTotal) AS TotalAmount,  Z.OrderCustomerFK, Z.CustomerName, z.OrderTotal as CustomerTotal   
  FROM Orders     
  INNER JOIN (SELECT DATE_FORMAT(OrderDate,'%M %Y') as Mon, OrderCustomerFK, CustomerName, SUM(OrderTotal) as OrderTotal 
                FROM Orders 
               GROUP BY  DATE_FORMAT(OrderDate,'%M %Y'), OrderCustomerFK, CustomerName ORDER BY SUM(OrderTotal) DESC LIMIT 1) Z
          ON Z.Mon = DATE_FORMAT(OrderDate,'%M %Y')
    GROUP BY DATE_FORMAT(OrderDate,'%m%y'), Z.OrderCustomerFK, Z.CustomerName
    ORDER BY DATE_FORMAT(OrderDate,'%y%m') DESC

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007