Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用MySQL选择数据_Mysql_Sql - Fatal编程技术网

用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 . . . 您只需使用左连接来引入其他表。如果这还不够,你应该问另一个问题。这个问题显然只涉及一个表,这回答了您提出的问题。是的,它清楚地回答了问题,所以我感谢您