我必须写一个MySQL查询: 查找在当天(01-JUL-11和02-JUL-11)销售的产品以及销售的总产品数量。
表格如下:
Date, Order_id, Product_id, Quantity
'01-JUL-11',O1,P1,5
'01-JUL-11',O2,P2,2
'01-JUL-11',O3,P3,10
'01-JUL-11',O4,P1,10
'02-JUL-11',O5,P3,5
'02-JUL-11',O6,P4,6
'02-JUL-11',O7,P1,2
'02-JUL-11',O8,P5,1
'02-JUL-11',O9,P6,2
'02-JUL-11',O10,P2,4
输出:
P1 17
P2 6
P3 15
到目前为止,我试过的是:
SELECT PRODUCT_ID, TOTAL FROM
(SELECT PRODUCT_ID, COUNT(PRODUCT_ID) AS COUNTER, SUM(TOTAL) TOTAL FROM
(Select ORDER_DAY, PRODUCT_ID, SUM(QUANTITY) AS TOTAL
FROM ORDERS
GROUP BY ORDER_DAY, PRODUCT_ID) ALIAS_1
GROUP BY PRODUCT_ID) ALIAS_2
WHERE COUNTER > 1;
它提供了正确的输出,但我认为它可以进行优化。
答案 0 :(得分:0)
如果表只有这两个日期,那么您的查询应该有效。唯一的区别是如果桌子上还有其他日期,您应该指定您想要的日期。
请参阅sqlfiddle:http://sqlfiddle.com/#!9/f700a5/6
Select `PRODUCT_ID`, SUM(`QUANTITY`)
FROM ORDERS
WHERE `ORDER_DAY` = '01-JUL-11' OR `ORDER_DAY` = '02-JUL-11'
GROUP BY PRODUCT_ID;
答案 1 :(得分:0)
正确查询:
SELECT `PRODUCT_ID`, SUM(`QUANTITY`)
FROM ORDERS
WHERE `ORDER_DAY` = '01-JUL-11' OR `ORDER_DAY` = '02-JUL-11'
GROUP BY `PRODUCT_ID`
HAVING COUNT(`ORDER_DAY`) > 1;
这将为您提供正确的结果。
答案 2 :(得分:0)
这是最简单的答案
SELECT PRODUCT_ID, SUM ( QUANTITY)
FROM CUSTOMER
WHERE DATE = '01-01-2001'
GROUP BY PRODUCT_ID
MINUS
SELECT PRODUCT_ID, SUM ( QUANTITY)
FROM CUSTOMER
WHERE DATE = '01-02-2001'
GROUP BY PRODUCT_ID;
答案 3 :(得分:0)
试试这个:
select product_id, sum(quantity) as total
from orders
group by product_id
having count(order_day) > 1;
答案 4 :(得分:0)
SELECT PRODUCT_ID,SUM(quantity) FROM ORDERS
GROUP BY PRODUCT_ID
HAVING count(distinct Order_date) > 1
答案 5 :(得分:0)
-两天销售的商品
SELECT PRODUCT_ID, DATE, COUNT(*)
FROM ORDERS
WHERE DATE IN ('01-JUL-11', '02-JUL-11')
GROUP BY PRODUCT_ID, DATE
ORDER BY PRODUCT_ID, DATE
HAVING COUNT(*) > 1
-两天售出的数量
SELECT PRODUCT_ID, SUM(QUANTITY) FROM ORDERS
WHERE PRODUCT_ID IN
(
SELECT PRODUCT_ID FROM --product_id sold on both days
(
SELECT PRODUCT_ID, DATE, COUNT(*)
FROM ORDERS
WHERE DATE IN ('01-JUL-11', '02-JUL-11')
GROUP BY PRODUCT_ID, DATE
ORDER BY PRODUCT_ID, DATE
HAVING COUNT(*) > 1
)
)
GROUP BY PRODUCT_ID;
答案 6 :(得分:0)
--2nd method -- Quantities sold on both days
SELECT PRODUCT_ID, SUM(QUANTITY) FROM ORDERS
WHERE PRODUCT_ID IN
(
SELECT PRODUCT_ID FROM
(
SELECT DISTINCT PRODUCT_ID FROM ORDERS WHERE DATE = '01-JUL-11'
INTERSECT
SELECT DISTINCT PRODUCT_ID FROM ORDERS WHERE DATE = '02-JUL-11'
)
)
GROUP BY PRODUCT_ID
ORDER BY PRODUCT_ID;
答案 7 :(得分:0)
我知道我们可以对其进行一些优化,但是在这里我能为您带来结果
SELECT `PRODUCT_ID`, QTY FROM ( SELECT `PRODUCT_ID`, SUM(`QUANTITY`) AS QTY, GROUP_CONCAT(`ORDER_DAY`) AS dates FROM ORDERS GROUP BY PRODUCT_ID) AS tmp WHERE dates LIKE '%02-JUL-11%' AND dates LIKE '%01-JUL-11%'
已更新,没有子查询
SELECT `PRODUCT_ID`, SUM(`QUANTITY`) AS QTY FROM ORDERS WHERE `ORDER_DAY` IN ('01-JUL-11', '02-JUL-11') GROUP BY PRODUCT_ID HAVING GROUP_CONCAT(`ORDER_DAY`) LIKE '%01-JUL-11%' AND GROUP_CONCAT(`ORDER_DAY`) LIKE '%02-JUL-11%'
答案 8 :(得分:0)
这是一个更通用的工作解决方案。试试这个:
select product_id ,sum(quantity) as total from ORDERS where product_id in
(
select product_id from (
select product_id,count(*) as cnt from
(
select distinct order_day,product_id from ORDERS
) distinct_product_day_combination
group by 1
having cnt in
(select count(distinct order_day ) from ORDERS
)
)
)
group by product_id
答案 9 :(得分:0)
SELECT DISTINCT
Product_id,
COUNT(quantity) OVER (PARTITION BY Product_id) AS [Count]
FROM tbl_orders
where date in ('01-JUL-11' , '02-JUL-11')