Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Fungsi agregat pada beberapa tabel tidak memberikan hasil yang benar

Saat Anda menambahkan tabel lain, Anda dapat memengaruhi jumlah baris dan ketika itu terjadi, agregasi juga akan terpengaruh. Untuk menghindari agregat tabel detail ini sehingga hanya ada satu baris per pesanan, maka agregasi lainnya akan tetap konsisten.

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

EDIT

Jangan gunakan "23:59" sebagai titik akhir untuk rentang tanggal, yang tidak akurat dan dapat menyebabkan hasil yang salah. Ada alternatif yang sangat sederhana dan lebih akurat yang hanya mengharuskan Anda untuk berhenti menggunakan "antara". Selain itu '12/31/2015 23:59' TIDAK cara aman untuk menentukan nilai tanggal/waktu. Gunakan '20160101' yang ADA format literal makan teraman di SQL Server 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. Tabel kalender untuk Data Warehouse

  2. Prosedur Tersimpan Vs. Tampilan

  3. Permintaan untuk membuat daftar semua prosedur tersimpan

  4. Perbarui dan tambahkan kecuali kosong

  5. Tally Table untuk memasukkan tanggal yang hilang di antara dua tanggal? SQL