如何实现mysql与条件语句的连接

如何实现mysql与条件语句的连接,mysql,Mysql,你好,我渴望得到帮助,因为我在一个复杂的逻辑查询上被困了两天,如果有人能帮我解决的话 订单表 区域表 预期产量 我努力实现的目标 我的查询输出 我在查询中的逻辑问题是什么?有一点是,数据应该是按财政年度提取的,而不仅仅是按正常年度提取的 谢谢 为了修复您的查询,您不应该使用GROUP BY YEAR,因为您的财政年度与日历年不匹配,并且您不希望在不同的行中而在列中输出不同的财政年度。您可以将查询转换为: SELECT regions.region_name, o.salePrev as

你好,我渴望得到帮助,因为我在一个复杂的逻辑查询上被困了两天,如果有人能帮我解决的话

订单表

区域表

预期产量

我努力实现的目标

我的查询输出

我在查询中的逻辑问题是什么?有一点是,数据应该是按财政年度提取的,而不仅仅是按正常年度提取的

谢谢

为了修复您的查询,您不应该使用GROUP BY YEAR,因为您的财政年度与日历年不匹配,并且您不希望在不同的行中而在列中输出不同的财政年度。您可以将查询转换为:

SELECT regions.region_name, 
    o.salePrev as `2010-11`,  
    o.saleCurrent as `2011-12`
FROM  (SELECT 
          region_id,
          SUM(IF(MONTH(orders.created_at)<4,sale,0)) salePrev,
          SUM(IF(MONTH(orders.created_at)>=4,sale,0)) saleCurrent
       FROM orders
       GROUP BY region_id
       ) o
INNER JOIN regions
ON o.region_id = regions.id;
但正如我在评论中提到的,你的情况MONTHorders.created_在 为了修复您的查询,您不应该使用GROUP BY YEAR,因为您的财政年度与日历年不匹配,并且您不希望在不同的行中而在列中输出不同的财政年度。您可以将查询转换为:

SELECT regions.region_name, 
    o.salePrev as `2010-11`,  
    o.saleCurrent as `2011-12`
FROM  (SELECT 
          region_id,
          SUM(IF(MONTH(orders.created_at)<4,sale,0)) salePrev,
          SUM(IF(MONTH(orders.created_at)>=4,sale,0)) saleCurrent
       FROM orders
       GROUP BY region_id
       ) o
INNER JOIN regions
ON o.region_id = regions.id;

但正如我在评论中提到的,你的条件MONTHorders.created__u____________________________________。但在您的数据源中,您只有:250+320+300+180+130+360+330=1870。那对我来说似乎不可能。另一点是检查MONTHorders.created_at>=4,但不检查年份,但在样本中,前提是您有日期标记20102011212,这样的逻辑似乎不太明智。@Alex,是的,您是对的。我只准备了演示数据,可能与屏幕之间的数据不匹配,但最后一点你问它没问题,实际上我想检查财政年度的月份是否下降,基于我只从我的时间戳字段中提取年份来计算要显示的年份。请指导我如何优化查询,如果我已经添加了,则可以删除不必要的逻辑。在您的预期结果中,您预期的总和为:960+260+560+340+140+280=2540。但在您的数据源中,您只有:250+320+300+180+130+360+330=1870。那对我来说似乎不可能。另一点是检查MONTHorders.created_at>=4,但不检查年份,但在样本中,前提是您有日期标记20102011212,这样的逻辑似乎不太明智。@Alex,是的,您是对的。我只准备了演示数据,可能与屏幕之间的数据不匹配,但最后一点你问它没问题,实际上我想检查财政年度的月份是否下降,根据我的时间戳字段,我只提取年份来确定要显示的年份。指导我如何优化查询,如果我已经添加了,则可以删除不必要的逻辑。由于年份是动态的,我不能像2012年或2010年那样设置硬编码,那么有什么解决方案可以使查询更加动态您的查询可以运行类似于我的预期输出屏幕吗?因为它可能是介于两个财政年度之间的任何年份。简单的方法是硬编码,我建议您对一些年份值进行编码。您可以从php或任何其他调用mysql的语言中设置它们。但如果您希望它们在列中是动态的,您应该了解mysql的透视表。例如:由于年份是动态的,我不能像2012年或2010年那样设置硬编码,那么有什么解决方案可以使查询更动态,使您的查询可以运行类似于我预期的输出屏幕?因为它可能是介于两个财政年度之间的任何年份。简单的方法是硬编码,我建议您对一些年份值进行编码。您可以从php或任何其他调用mysql的语言中设置它们。但如果您希望它们在列中是动态的,您应该了解mysql的透视表。例如:
select distinct `regions`.`region_name`, sum(orders.sale) as sum, 
CASE WHEN MONTH(orders.created_at)>=4 THEN
concat(YEAR(orders.created_at), '-',YEAR(orders.created_at)+1)
ELSE concat(YEAR(orders.created_at)-1,'-', YEAR(orders.created_at)) 
END AS financial_year from `orders` inner join `regions` on `orders`.`region_id` = `regions`.`id` group by YEAR(orders.created_at), `regions`.`region_name` order by `orders`.`region_id` asc,  YEAR(orders.created_at) asc
SELECT regions.region_name, 
    o.salePrev as `2010-11`,  
    o.saleCurrent as `2011-12`
FROM  (SELECT 
          region_id,
          SUM(IF(MONTH(orders.created_at)<4,sale,0)) salePrev,
          SUM(IF(MONTH(orders.created_at)>=4,sale,0)) saleCurrent
       FROM orders
       GROUP BY region_id
       ) o
INNER JOIN regions
ON o.region_id = regions.id;
SELECT regions.region_name, 
    o.salePrev as `2010-11`,  
    o.saleCurrent as `2011-12`
FROM  (SELECT 
          region_id,
          SUM(IF(
                (MONTH(orders.created_at)<4 && YEAR(orders.created_at) = 2012)
                || YEAR(orders.created_at) < 2012
            ,sale,0)) salePrev,
          SUM(IF(MONTH(orders.created_at)>=4 && YEAR(orders.created_at) = 2012,sale,0)) saleCurrent
       FROM orders
       GROUP BY region_id
       ) o
INNER JOIN regions
ON o.region_id = regions.id;
SELECT r.region_name, 
    SUM(IF(o.f_year=2010,o.y_sale,0)) as `2010-11`,  
    SUM(IF(o.f_year=2011,o.y_sale,0)) as `2011-12`,
    SUM(IF(o.f_year=2012,o.y_sale,0)) as `2012-13`
FROM  (SELECT 
          region_id,
          IF(MONTH(orders.created_at)<4,YEAR(created_at)-1,YEAR(created_at)) f_year,
          SUM(sale) y_sale
       FROM orders
       GROUP BY region_id, f_year
       ) o
INNER JOIN regions r
ON o.region_id = r.id
GROUP BY r.id