微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取数据的单行结果

如何解决如何获取数据的单行结果

我有以下两个表,

表格期间

s

Id  Names
1   Simon
2   Davis

表架构不是最好的,但我无能为力。

我需要根据以下条件检索 ID 的天数,

  • 如果 sYear 为 0,则返回 0
  • 如果 sYear 介于 1 和 5 之间,则返回 21,如果是上述示例数据中的 id 2,则返回 26
  • 如果 sYear 大于 5 返回 30

days 列值因不同的 ID 而不同,但 sYear 始终为 0,1 和 5。

我的尝试看起来像,

Id    sYear        days
1      0             0      
1      1             21     
1      5             30 
2      0             0      
2      1             26     
2      5             30      

给出的结果为,

set @sYear = 7;

SELECT 
    et.id,names,CASE
        WHEN @sYear = 0 THEN days
        WHEN @sYear BETWEEN 1 AND 5 THEN days
        WHEN @sYear > 5 THEN days
    END as Result
FROM
    Periods ep
        JOIN
    Tier et ON (et.id = ep.id) AND et.id = 2;

而所需的结果是,

id  names   Result
2   Davis    0
2   Davis    26
2   Davis    30

因为 @sYear = 7 大于 5。

dbfiddle

解决方法

以下查询将生成您可以在表中找到的结果:

@sYear = 7

id 名字
1 30 西蒙
2 30 戴维斯

@sYear = 3

id 名字
1 21 西蒙
2 26 戴维斯

@sYear = 0

id 名字
1 0 西蒙
2 0 戴维斯
SELECT 
    et.id,names,days as result 
FROM
    Tier et,Periods p
WHERE
    et.id = p.id
        AND et.days = (CASE
        WHEN @sYear = 0 THEN 0
        WHEN
            @sYear BETWEEN 1 AND 5 AND et.id = 2
        THEN
            (SELECT 
                    days
                FROM
                    Tier et
                WHERE
                    sYear = 1 AND et.id = 2)
        WHEN
            @sYear BETWEEN 1 AND 5 AND et.id = 1
        THEN
            (SELECT 
                    days
                FROM
                    Tier et
                WHERE
                    sYear = 1 AND et.id = 1)
        WHEN @sYear > 5 THEN 30
    END);
,

以下查询将准确生成您在问题中定义的结果:

@sYear = 7

id 名字 结果
2 戴维斯 30
SELECT 
    et.id,days AS result
FROM
    Tier et,Periods p
WHERE
    et.id = p.id AND et.id = 2
        AND et.days = (CASE
        WHEN @sYear = 0 THEN 0
        WHEN
            @sYear BETWEEN 1 AND 5 AND et.id = 2
        THEN
            (SELECT 
                    days
                FROM
                    Tier et
                WHERE
                    sYear = 1 AND et.id = 2)
        WHEN
            @sYear BETWEEN 1 AND 5 AND et.id = 1
        THEN
            (SELECT 
                    days
                FROM
                    Tier et
                WHERE
                    sYear = 1 AND et.id = 1)
        WHEN @sYear > 5 THEN 30
    END);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。