Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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中SELECT中的条件_Mysql - Fatal编程技术网

mysql中SELECT中的条件

mysql中SELECT中的条件,mysql,Mysql,我有一个类似这样的查询 SELECT customer, totalvolume FROM orders WHERE deliverydate BETWEEN '2020-01-01' AND CURDATE() 有没有办法选择特定日期范围的totalvolume并将其作为一个单独的列? 例如,我已经有了totalvolume。我还想将上个月的总产量添加为一个单独的列totalvolume,其中交货日期介于“2020-08-01”和“2020-08-31”之间。有这样的功能吗?只需使用两个表

我有一个类似这样的查询

SELECT customer, totalvolume
FROM orders 
WHERE deliverydate BETWEEN '2020-01-01' AND CURDATE()
有没有办法选择特定日期范围的totalvolume并将其作为一个单独的列?
例如,我已经有了totalvolume。我还想将上个月的总产量添加为一个单独的列totalvolume,其中交货日期介于“2020-08-01”和“2020-08-31”之间。有这样的功能吗?

只需使用两个表格副本即可:

SELECT t1.customer, t1.totalvolume, t2.totalvolume previousvolume
FROM orders t1
LEFT JOIN orders t2 ON t1.customer = t2.customer
                   AND t1.deliverydate = t2.deliverydate + INTERVAL 1 MONTH
WHERE t1.deliverydate BETWEEN '2020-08-01' AND '2020-08-31';

只需使用2份表格副本:

SELECT t1.customer, t1.totalvolume, t2.totalvolume previousvolume
FROM orders t1
LEFT JOIN orders t2 ON t1.customer = t2.customer
                   AND t1.deliverydate = t2.deliverydate + INTERVAL 1 MONTH
WHERE t1.deliverydate BETWEEN '2020-08-01' AND '2020-08-31';

您可以在列中使用case/when构造,只需扩展WHERE子句。有时我会通过使用第二个@variables来简化我的子句。差不多

SELECT 
      o.customer, 
      sum( case when o.deliveryDate < @beginOfMonth 
                then o.TotalVolume else 0 end ) PriorMonthVolume,
      sum( case when o.deliveryDate >= @beginOfMonth 
                then o.TotalVolume else 0 end ) ThisMonthVolume,
      sum( o.totalvolume ) TwoMonthsVolume
   FROM 
      ( select @myToday := date(curdate()),
               @beginOfMonth := date_sub( @myToday, interval dayOfMonth( @myToday ) -1 day ),
               @beginLastMonth := date_sub( @beginOfMonth, interval 1 month ) ) SqlVars,      
      orders o
   WHERE 
      o.deliverydate >= @beginLastMonth
   group by 
      o.customer
首先,查询别名SqlVars的from子句将动态创建3个变量,并为该集合返回一行。在没有联接条件的情况下,orders表中所有内容的比率始终为1:1。很好,您不必预先声明变量,@变量可用于查询

通过查询上个月初当天或之后的所有记录,您将获得两个月的所有记录。sum case/when现在可以使用这些变量作为各卷总计的分界点


我知道您提到过这是一个简化的查询,但这可能不是您所需要的完美答案,但可能有助于您从不同的查询角度来看待它。

您可以在列中使用case/when构造并展开WHERE子句。有时我会通过使用第二个@variables来简化我的子句。差不多

SELECT 
      o.customer, 
      sum( case when o.deliveryDate < @beginOfMonth 
                then o.TotalVolume else 0 end ) PriorMonthVolume,
      sum( case when o.deliveryDate >= @beginOfMonth 
                then o.TotalVolume else 0 end ) ThisMonthVolume,
      sum( o.totalvolume ) TwoMonthsVolume
   FROM 
      ( select @myToday := date(curdate()),
               @beginOfMonth := date_sub( @myToday, interval dayOfMonth( @myToday ) -1 day ),
               @beginLastMonth := date_sub( @beginOfMonth, interval 1 month ) ) SqlVars,      
      orders o
   WHERE 
      o.deliverydate >= @beginLastMonth
   group by 
      o.customer
首先,查询别名SqlVars的from子句将动态创建3个变量,并为该集合返回一行。在没有联接条件的情况下,orders表中所有内容的比率始终为1:1。很好,您不必预先声明变量,@变量可用于查询

通过查询上个月初当天或之后的所有记录,您将获得两个月的所有记录。sum case/when现在可以使用这些变量作为各卷总计的分界点


我知道您提到过这是一个简化的查询,但这可能不是您需要的完美答案,但可能会帮助您从不同的查询角度来看待它。

谢谢,问题是查询本身要大得多。为了简单起见,我只举了一个小例子。我希望我不必为此加入两个查询task@alexb如果你的MySQL版本是8+那么就使用CTE。如果没有,则使用2个查询副本,这完全相同,直到换行符和空格的数量以及服务器是否足够聪明,可以执行此子查询一次为止。或者在真正的存储结构和表达式上发布真正的任务。谢谢,问题是查询本身要大得多。为了简单起见,我只举了一个小例子。我希望我不必为此加入两个查询task@alexb如果你的MySQL版本是8+那么就使用CTE。如果没有,则使用2个查询副本,这完全相同,直到换行符和空格的数量以及服务器是否足够聪明,可以执行此子查询一次为止。或者在真实的存储结构和表达式上发布真实的任务。这是一个有趣的建议!我以前从未使用过这些结构。谢谢你的建议,我一定会调查的!这是一个有趣的建议!我以前从未使用过这些结构。谢谢你的建议,我一定会调查的!