2009-05-04 35 views
8

Hãy nói rằng tôi có một bảng:SQL Chọn nhiều khoản tiền?

SELECT SUM(quantity) AS items_sold_since_date, 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 

này trả về một danh sách các sản phẩm với số lượng bán ra kể từ một ngày cụ thể. Có cách nào để chọn không chỉ số tiền này, nhưng CSONG tổng số KHÔNG CÓ điều kiện ở đâu? Tôi muốn xem doanh số bán hàng kể từ một ngày cụ thể cho mỗi sản phẩm cùng với tất cả (không phải ngày hạn chế) bán hàng.

Trả lời

21
SELECT SUM(CASE WHEN order_date >= '01/01/09' THEN quantity ELSE 0 END) AS items_sold_since_date, 
     SUM(quantity) AS items_sold_total, 
     product_ID 
FROM Sales 
GROUP BY product_ID 
+0

nên nhanh hơn nhiều so với một truy vấn phụ tương quan :) –

+1

sẽ upvote này 20 lần nếu tôi có thể. chỉ tái cấu trúc truy vấn của tôi bằng ví dụ của bạn và đạt được hiệu suất tăng gấp năm lần so với giải pháp trước đây của tôi = D thx! –

0

bạn có thể viết

SELECT SUM(quantity) AS items_sold_since_date,(SELECT SUM(quantity) AS items_sold_since_date FROM Sales 
GROUP BY product_ID) as items_sold, 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 
0

một cái gì đó như thế này ?:

SELECT SUM(quantity) AS items_sold_since_date, 
     total_items_sold = (SELECT SUM(quantity) from Sales GROUP BY product_ID), 
     product_ID 
FROM Sales 
WHERE order_date >= '01/01/09' 
GROUP BY product_ID 
0

Nếu bạn muốn thấy tổng doanh thu bên cạnh, sau đó bạn sẽ sử dụng sum (sale_amt), và trong nhóm bằng cách thêm sale_amt. Tôi hy vọng nó sẽ giúp.

0

Bạn có thể sử dụng GROUP BY để chia nhỏ Doanh số dựa trên ngày. Trong Oracle bạn có thể nói:

select count(*) 
     ,case when order_date >= '01/01/09' then 'after' else 'before' end 
from log 
group by case when order_date >= '01/01/09' then 'after' else 'before' end; 
Các vấn đề liên quan