2017-09-05 26 views
1

我有一个查询可以处理大部分我需要的内容,但不能为空结果提供表示逻辑。使用MySQL DAYNAME作为列标题,即使使用NULL结果

考虑这个查询:

SELECT 
SUM(order_detail.price/order_detail.qty*order_detail.qty_dispatched) AS orderedPrice, 
orders.location, 
orders.id, 
suppliers.supplier_name, 
DAYNAME(FROM_UNIXTIME(orders.datetime)) AS Day_Name, 
from_unixtime(orders.datetime) AS Day_Date 
FROM orders, order_detail, products,suppliers 
WHERE (orders.datetime BETWEEN '$from_date' AND '$to_date' 
AND order_detail.order_id = orders.id 
AND orders.location LIKE '%$locations%' 
AND order_detail.product_id=products.id 
AND products.supplier_id IN ($suppliers) 
AND suppliers.id IN ($suppliers) 
AND products.supplier_id=suppliers.id 
AND (orders.status <> 'deleted')) 

如果我得到的结果为天星期我可以用PHP后期处理,并出示结果作为这样的:

Location | Supplier Name | Mon | Tue | Wed | Thu | Fri | Sat | Sun | Total 
-------------------------------------------------------------------------- 
Alhambra | Widget Co  | $50 | $50 | $50 | $50 | $50 | $50 | $50 | $350 

然而,如果在任何一天没有订单,我显然得不到任何结果,并且我不能在后续流程中以一个列中的$ 0的价格出现。

我想也许是一个工作日表可能是一个JOIN的答案,但我无法想象它。像这样?

CREATE TABLE week_days(
    week_day_num INT(11) DEFAULT NULL 
); 

INSERT INTO week_days(week_day_num) VALUES (1),(2),(3),(4),(5),(6),(7); 

SELECT 
DAYNAME(FROM_UNIXTIME(orders.datetime)) AS day_name, 
SUM(order_detail.price/order_detail.qty*order_detail.qty_dispatched) AS orderedPrice, 
COALESCE(SUM(order_detail.price/order_detail.qty*order_detail.qty_dispatched) AS orderedPrice , 0) 
FROM week_days wd 
LEFT JOIN (

SELECT 
orders.location, 
orders.id, 
suppliers.supplier_name, 
from_unixtime(orders.datetime) AS Day_Date 
FROM orders, order_detail, products,suppliers 
WHERE (orders.datetime BETWEEN '$from_date' AND '$to_date' 
AND order_detail.order_id = orders.id 
AND orders.location LIKE '%$locations%' 
AND order_detail.product_id=products.id 
AND products.supplier_id IN ($suppliers) 
AND suppliers.id IN ($suppliers) 
AND products.supplier_id=suppliers.id 
AND (orders.status <> 'deleted')) 


) order_results 
ON wd.week_day_num = DAYOFWEEK(FROM_UNIXTIME(orders.datetime)) 
GROUP BY 
     products.supplier_id,orders.location,DAYOFWEEK(FROM_UNIXTIME(orders.datetime)) 

ORDER BY location, products.supplier_id,Day_Date ASC; 
+0

如果您使用PHP进行透视,为什么每天都需要一个结果? PHP可以简单地执行'if(isset($ data [$ weekday])){显示那天的结果; } else {display $ 0}'。 – Barmar

+0

我认为GROUP BY应该进入您的LEFT JOIN并移除“产品”。在你的ORDER BY中。 – etsa

+0

@Barmar每一行都是一天,我需要为给定周内至少有1个结果的每个位置/供应商合并一周的价值。 –

回答

0

你这里语法wroing:

COALESCE(SUM(order_detail.price/order_detail.qty*order_detail.qty_dispatched) AS orderedPrice , 0) 

AS条款需要在COALESCE功能外去。

COALESCE(SUM(order_detail.price/order_detail.qty*order_detail.qty_dispatched), 0) AS orderedPrice 
+0

谢谢。我运行了查询,但结果集已关闭。 –

+0

你需要解释它有什么问题。 – Barmar

+0

仍然没有空,每周的几天也得到一个初始空行 –

相关问题