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个查询副本,这完全相同,直到换行符和空格的数量以及服务器是否足够聪明,可以执行此子查询一次为止。或者在真实的存储结构和表达式上发布真实的任务。这是一个有趣的建议!我以前从未使用过这些结构。谢谢你的建议,我一定会调查的!这是一个有趣的建议!我以前从未使用过这些结构。谢谢你的建议,我一定会调查的!