【问题标题】:Select statement with multiple rows from condition on values in single column从单列值的条件中选择具有多行的语句
【发布时间】:2014-08-09 15:02:45
【问题描述】:

我有下表。使用薪水作为条件,我想获得多行。 下面是当前表,称之为员工。

    empid     name         salary
-----------------------------------
1   A1        alex        20000
2   B2        ben         4500
3   C1        carl        14000

将工资与某个固定值进行比较,每次工资大于固定值时,在输出中显示一条记录。我的尝试条件案例接近这个:

   incometype= case When salary<6000 then 101 When salary Between 6000 And 18000 Then
   102 Else 103 End

期望的输出是:

     empid     name   salary  incometype
------------------------------------------
1   A1        alex    20000    101
2   A1        alex    20000    102
3   A!        alex    20000    103
4   B2        ben     4500     101
5   C1        carl    14000    101
6   C1        carl    14000    102

我曾尝试使用联合,但即使值满足第一个条件,联合也会为每条记录提供 3 行。

【问题讨论】:

  • 不应该是 1 对 1 映射到您的输入吗?为什么要为 3 个输入行返回 6 行?
  • @shree.pat18 我需要像这样的税收范围。长话短说,我的理想输出需要如上所述

标签: sql select conditional-statements


【解决方案1】:

这将返回 3 行,足以满足您的需要:

  SELECT empid, name, salary, 
    case When salary<6000 then 101 
         When salary Between 6000 And 18000 Then 102 
         Else 103 End as incometype
    FROM employee;

【讨论】:

  • 这将只给我一个不适合我需要的输出。例如 14000 不会出现在两行中,一行 101 另一行 102
  • 根据上述查询您的权利,但理想情况下应该对 101 和 102 征税。
【解决方案2】:

您的问题不清楚,因为您的逻辑暗示您应该只为 3 个输入行提供 3 个输出行。但是,您的输出意味着您要将薪水与某些固定值进行比较,并且每次薪水大于固定值时,都会在输出中显示一条记录。

如果是前者,那么你只需要 Minh 的查询。在后一种情况下,您可以执行以下操作:

select e.*, m.incometype
from employee e
left join 
( 
 select 0 as threshold, 101 as incometype
 union
 select 5999 as threshold, 102 as incometype
 union
 select 17999 as threshold, 103 as incometype
) m
on e.salary > m.threshold
order by e.empid

如果您想添加一个计算列,即使用此查询中的列计算的值,您可以简单地将其添加为select 子句中的列,如下所示:

select e.*, 
m.incometype, 
case 
when <first condition> then <business logic here>
....
else <handle default case>
end as yourcomputedcolumn
from
...

【讨论】:

  • 我出于解释目的提供了该条件,因为我无法建立正确的逻辑,您的上述解决方案可能会解决问题。我的查询更大更复杂,因此我调整到可以快速获得帮助的方面没有超载。谢谢
  • 很公平。让我知道我的解决方案是否适合您。顺便说一句,您使用的是哪个 RDBMS,尽管我的仅使用标准操作。
  • 如果我需要添加另一个列税仍然基于 Grosspay 其中类型 101 tax=0.6 *grosspay,102 tax=0.6 *(grosspay-6000),103 tax =0
  • 我建议您将此作为一个单独的问题添加,以获得更好的可见性。然而,简而言之,一旦你有了这些列,你就可以在查询中添加一个计算列。
  • 你能开始聊天吗?确定它是小事我只是不知道如何在查询中添加它
【解决方案3】:

对要求不是很清楚,但是以下对我有用:

Select 
    EmpId,Name,Sal,101 IncomeType
from Emp
Union all
Select 
    EmpId,Name,Sal,102
from Emp
Where Sal > 6000
union all
Select 
    EmpId,Name,Sal,103
from Emp
Where Sal > 18000;

【讨论】:

  • 那是我最初的试验,但是每个时间都会给出 3 行,请参阅@shree 的解决方案。这就是我所需要的。谢谢。
  • 我不这么认为。请注意,我已经根据一组不同的条件过滤了记录。只有第一个选择会返回表中的所有行。
  • 我没有注意到实际上这看起来应该也可以。让我试试,另外我需要添加另一列税,如果工资
  • 应该这样做:选择 EmpId,Name,Sal,IncomeType,Case IncomeType When 101 then 0.6 * Sal WHEN 102 then 0.6 *(Sal-6000) Else 0 End as Tax From (Select EmpId, Name,Sal,101 IncomeType from Emp Union all Select EmpId,Name,Sal,102 from Emp Where Sal > 6000 union all Select EmpId,Name,Sal,103 from Emp Where Sal > 18000);
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2019-03-06
相关资源
最近更新 更多