mysql查询返回错误值

时间:2020-08-09 12:11:48

标签: mysql sql

我有以下数据,

started ended   theDate     theYear themonth    growth  division    teams   status   location
2         0      8/31/2019  2019    8            2    Unknown       Team A  ACTIVE   Town A
1         0      5/31/1996  1996    5            1    Unknown       Team B  ACTIVE   Town A
1         0      8/31/2014  2014    8            1    Unknown       Team B  ACTIVE   Town B
1         0      1/31/1996  1996    1            1    Unknown       Team B  ACTIVE   Town C
1         0      7/31/2004  1985    7            1    Unknown       Team C  ACTIVE   Town E
1         0      7/31/1985  1985    7            1    Unknown       Team B  ACTIVE   Town A
1         0      5/31/2019  2019    5            1    Unknown       Team A  ACTIVE   Town F

“开始”列显示在该特定日期加入的员工。增长列开始-结束是结束的剩余员工人数。

我有以下查询,只要我指定变量即可正确提取数据。

set @theYear = 2019 ;
set @team = 'Team A' ;


SELECT 
    t1.growth,
    SUM(t2.growth) AS Emp_Count,
    CASE
        WHEN t1.theYear IS NULL THEN t1.theYear
        ELSE t1.theYear
    END AS theYear,
     t1.team,
    t1.location,
    t1.division,
    t1.status,
    CASE
        WHEN t1.Month = 1 THEN 'JAN'
        WHEN t1.Month = 2 THEN 'FEB'
        WHEN t1.Month = 3 THEN 'MAR'
        WHEN t1.Month = 4 THEN 'APR'
        WHEN t1.Month = 5 THEN 'MAY'
        WHEN t1.Month = 6 THEN 'JUN'
        WHEN t1.Month = 7 THEN 'JUL'
        WHEN t1.Month = 8 THEN 'AUG'
        WHEN t1.Month = 9 THEN 'SEP'
        WHEN t1.Month = 10 THEN 'OCT'
        WHEN t1.Month = 11 THEN 'NOV'
        WHEN t1.Month = 12 THEN 'DEC'
    END AS myMONTH
FROM
    (SELECT 
        CASE
                WHEN r.growth IS NOT NULL THEN r.growth
                WHEN r.growth IS NULL THEN 0
            END AS growth,
            r.theYear,
            r.team,
            r.division,
            r.location,
            t.mon_num AS Month,
            r.status
    FROM
        Reports r
    RIGHT JOIN (SELECT 1 mon_num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) t ON t.mon_num = r.themonth
        AND r.theYear =  (select @theYear)
        AND r.team = (select @team)
    GROUP BY r.growth , Month
    ORDER BY t.mon_num ASC) AS t1
        JOIN
    (SELECT 
        CASE
                WHEN r2.growth IS NOT NULL THEN r2.growth
                WHEN r2.growth IS NULL THEN 0
            END AS growth,
            r2.theYear,
            r2.team,
            r2.division,
            r2.location,
            t.mon_num AS Month,
            r2.status
    FROM
        Reports r2
    RIGHT JOIN (SELECT 1 mon_num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) t ON t.mon_num = r2.themonth
        AND r2.theYear = (select @theYear)
        AND r2.team = (select @team)
    GROUP BY r2.growth , Month
    ORDER BY t.mon_num ASC) AS t2 ON t1.Month >= t2.Month
GROUP BY t1.Month;

如您在下面看到的那样,查询将列出月份(即Jan,feb等)以及所选数据以及增量计数。

enter image description here

但是,如果我要使用不带变量的查询,即获取所有没有任何条件/过滤器的数据,我得到的结果是不正确的。首先,它应该以1985年开始,因为我的数据集中确实有1985年。

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个非常复杂的查询。明智的程序员可以一次对子查询进行此类故障排除。

您的查询包含以下代码:

        AND r.theYear =  (select @theYear)

如果未定义@ -variable,应该怎么办?

您想要这样的东西吗?

 AND (@theYear IS NULL OR r.theYear=@theYear)

如果您的@ -variable为NULL,则不会按年份过滤。

相关问题