如何解决如何获取数据的单行结果
我有以下两个表,
表格期间,
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。
解决方法
以下查询将生成您可以在表中找到的结果:
@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 举报,一经查实,本站将立刻删除。