用MySQL选择数据
我在查询中有一个小问题需要解决,我有以下查询:用MySQL选择数据,mysql,sql,Mysql,Sql,我在查询中有一个小问题需要解决,我有以下查询: SELECT SUM(total) AS total, products, DATE_FORMAT(TransDate, '%M') AS month FROM orders WHERE Status = 'paid' AND YEAR(TransDate) = '2016' GROUP BY Product, YEAR(TransDate), MONTH(TransDate) ORDER BY TransDate ASC 我对此查询的回报如下:
SELECT SUM(total) AS total, products, DATE_FORMAT(TransDate, '%M') AS month
FROM orders
WHERE Status = 'paid'
AND YEAR(TransDate) = '2016'
GROUP BY Product, YEAR(TransDate), MONTH(TransDate)
ORDER BY TransDate ASC
我对此查询的回报如下:
全部的
产品
月
12000
福特蒙迪欧
简
23000
卡马罗
简
9000
高尔夫球运动
简
42000
奥迪A4
简
4566
福特蒙迪欧
二月
35435
卡马罗
二月
58456
高尔夫球运动
二月
56465
奥迪A4
二月
3522
福特蒙迪欧
破坏
468132
卡马罗
破坏
25225
高尔夫球运动
破坏
54612
奥迪A4
破坏
12000
福特蒙迪欧
四月
23000
卡马罗
四月
9000
高尔夫球运动
四月
42000
奥迪A4
四月
54554
披头士乐队
四月
12000
福特蒙迪欧
也许
23000
卡马罗
也许
9000
高尔夫球运动
也许
42000
奥迪A4
也许
54554
披头士乐队
也许
使用交叉联接生成所有产品/日期组合。然后使用left join输入订单信息。如果您没有其他方便的方法(如日历表),可以使用订单子查询获取日期:
SELECT ym.yyyymm, p.product, COALESCE(SUM(o.total), 0) AS total
FROM (SELECT DISTINCT DATE_FORMAT(TransDate, '%M') as yyyymm,
YEAR(TransDate) as yyyy, MONTH(TransDate) as mm
FROM orders o
WHERE TransDate >= '2016-01-01' and TransDate < '2017-01-01'
) ym CROSS JOIN
(SELECT DISTINCT o.product FROM orders o
) p LEFT JOIN
orders o
ON YEAR(o.TransDate) = ym.yyyy AND
MONTH(o.TransDate) = ym.mm AND
o.product = p.product AND
o.Status = 'paid'
GROUP BY p.Product, ym.yyyymm
ORDER BY MIN(o.TransDate), p.Product;
使用交叉联接生成所有产品/日期组合。然后使用left join输入订单信息。如果您没有其他方便的方法(如日历表),可以使用订单子查询获取日期:
SELECT ym.yyyymm, p.product, COALESCE(SUM(o.total), 0) AS total
FROM (SELECT DISTINCT DATE_FORMAT(TransDate, '%M') as yyyymm,
YEAR(TransDate) as yyyy, MONTH(TransDate) as mm
FROM orders o
WHERE TransDate >= '2016-01-01' and TransDate < '2017-01-01'
) ym CROSS JOIN
(SELECT DISTINCT o.product FROM orders o
) p LEFT JOIN
orders o
ON YEAR(o.TransDate) = ym.yyyy AND
MONTH(o.TransDate) = ym.mm AND
o.product = p.product AND
o.Status = 'paid'
GROUP BY p.Product, ym.yyyymm
ORDER BY MIN(o.TransDate), p.Product;
嗨,戈登,谢谢你的回答。但是,如果我在这个查询中已经有一个左连接,那么会有什么变化?例如:选择SUMAmount作为total,orders.products,DATE_FORMATTransDate,“%M”作为orders上交易记录的月份。ordnumber=transactions.ordnumber,其中transactions.Status为NULL或transactions.Status='paid'和YEARtransactions.TransDate='2016'按订单分组。产品,YearTransDate,MONTHtransactions.TransDate ORDER BY transactions.TransDateASC@Vitor . . . 您只需使用左连接来引入其他表。如果这还不够,你应该问另一个问题。这个问题显然只涉及一个表格,这回答了你提出的问题。是的,它清楚地回答了问题,所以我感谢你嗨,戈登,谢谢你的回答。但是,如果我在这个查询中已经有一个左连接,那么会有什么变化?例如:选择SUMAmount作为total,orders.products,DATE_FORMATTransDate,“%M”作为orders上交易记录的月份。ordnumber=transactions.ordnumber,其中transactions.Status为NULL或transactions.Status='paid'和YEARtransactions.TransDate='2016'按订单分组。产品,YearTransDate,MONTHtransactions.TransDate ORDER BY transactions.TransDateASC@Vitor . . . 您只需使用左连接来引入其他表。如果这还不够,你应该问另一个问题。这个问题显然只涉及一个表,这回答了您提出的问题。是的,它清楚地回答了问题,所以我感谢您