Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

सही परिणाम नहीं दे रहे एकाधिक तालिकाओं पर कुल कार्य

जब आप कोई अन्य तालिका जोड़ते हैं तो आप पंक्तियों की संख्या को प्रभावित कर सकते हैं और जब ऐसा होता है तो एकत्रीकरण भी प्रभावित होगा। इससे बचने के लिए विवरण तालिका को एकत्रित करें ताकि प्रति आदेश केवल एक पंक्ति हो, फिर अन्य एकत्रीकरण सुसंगत रहेगा।

SELECT
      Customers.EmailAddress
    , COUNT(Orders.OrderID)                                                                                            AS 'overall NumOrders'
    , SUM(Orders.PaymentAmount)                                                                                        AS 'overall TotalOrdered'
    , SUM(od.totalcost) AS totalcost
    , COUNT(CASE WHEN Orders.OrderDate >= '20170101' THEN Orders.OrderID END)                                          AS '2017 NumOrders'
    , SUM(CASE WHEN Orders.OrderDate >= '20170101' THEN Orders.PaymentAmount END)                                      AS '2017 TotalOrdered'
    , COUNT(CASE WHEN Orders.OrderDate BETWEEN ' 01/01/2015 00:00' AND '12/31/2015 23:59' THEN Orders.OrderID END)     AS '2015 NumOrders'
    , SUM(CASE WHEN Orders.OrderDate BETWEEN ' 01/01/2015 00:00' AND '12/31/2015 23:59' THEN Orders.PaymentAmount END) AS '2015 TotalOrdered'
FROM Customers
JOIN Orders ON Customers.Customerid = Orders.Customerid
JOIN (
      SELECT
            Orderid
          , SUM((Vendor_Price) * (Quantity)) AS totalcost
      FROM OrderDetails
      GROUP BY
            Orderid
) od ON Orders.Orderid = od.Orderid
WHERE Orders.OrderStatus NOT IN ('Cancelled', 'Payment Declined')
AND Orders.OrderDate BETWEEN ' 01/01/2015 00:00' AND GETDATE()
GROUP BY
      Customers.EmailAddress

संपादित करें

कृपया "23:59" का उपयोग किसी दिनांक सीमा के लिए अंतिम बिंदु के रूप में न करें, जो सटीक नहीं है और गलत परिणाम दे सकता है। एक बहुत ही सरल और अधिक सटीक विकल्प है जिसके लिए आपको "बीच" का उपयोग बंद करने की आवश्यकता है। इसके अतिरिक्त '12/31/2015 23:59' नहीं है दिनांक/समय मान निर्दिष्ट करने का एक सुरक्षित तरीका। '20160101' का प्रयोग करें जो IS . है SQL सर्वर YYYYMMDD में सबसे सुरक्षित खाया गया शाब्दिक प्रारूप ।

    , COUNT(CASE WHEN Orders.OrderDate >= '20150101' AND Orders.OrderDate < '20160101' THEN Orders.OrderID END)     AS '2015 NumOrders'
    , SUM(CASE WHEN Orders.OrderDate >='20150101' AND Orders.OrderDate < '20160101' THEN Orders.PaymentAmount END) AS '2015 TotalOrdered'



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मौजूदा SQL Server 2005 डेटाबेस में डेटाटाइप varchar को nvarchar में बदलें। कोई परेशानी?

  2. SQL सर्वर में किसी तालिका में इष्टतम अद्वितीय पहचानकर्ता कैसे खोजें:sp_special_columns

  3. एक्सएमएल फील्ड - क्वेरी

  4. SQL DATE से केवल माह और वर्ष प्राप्त करना

  5. क्या विशिष्ट कार्यक्रमों से SQL सर्वर तक पहुँच से इनकार करना संभव है?