我有一个查询可以处理大部分我需要的内容,但不能为空结果提供表示逻辑。使用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;
如果您使用PHP进行透视,为什么每天都需要一个结果? PHP可以简单地执行'if(isset($ data [$ weekday])){显示那天的结果; } else {display $ 0}'。 – Barmar
我认为GROUP BY应该进入您的LEFT JOIN并移除“产品”。在你的ORDER BY中。 – etsa
@Barmar每一行都是一天,我需要为给定周内至少有1个结果的每个位置/供应商合并一周的价值。 –