MySQL查询以查找在两天内销售的产品

时间:2016-06-19 01:21:28

标签: mysql

我必须写一个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;

它提供了正确的输出,但我认为它可以进行优化。

10 个答案:

答案 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')