请帮我这个数据库查询

时间:2012-11-22 13:22:21

标签: sql oracle10g plsqldeveloper

我有表xyz,我有13列,即emplid,jan,feb ... dec。 这里我的数据如下

EMPLID  JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
123      0   0   0   0   0   5   5   2   6   0   0   0
456      0   2   3   0   0   0   5   5   3   0   0   0
789      5   0   0   5   0   5   0   5   6   3   0   4
ABC      4   5   0   5   5   0   5   0   6   0   0   0

现在我需要编写一个查询,以便在第一个月输出一些数据而不是0 例如:如果我检查EMPLID 123,我应该输出为JUN(因为JUN是此EMPLID的第一个月,其中数据不是0) 同样地,对于456,它将是FEB,对于789而ABC是它的JAN。

3 个答案:

答案 0 :(得分:2)

正如 Philipp 在评论中所说,你的表格结构肯定是要改变的。另外,你将来会遇到很多类似的问题..

要回答你的问题,你可以试试这个:

 select case when JAN > 0 then 'JAN'
             when FEB > 0 then 'FEB'
             when MAR > 0 then 'MAR'
             when APR > 0 then 'APR'
             when MAY > 0 then 'MAY'
             when JUN > 0 then 'JUN'
             when JUL > 0 then 'JUL'
             when AUG > 0 then 'AUG'
             when SEP > 0 then 'SEP'
             when OCT > 0 then 'OCT'
             when NOV > 0 then 'NOV'
             when DEC > 0 then 'DEC'
        end as Month
from xyz
where EMPLID='456'

SQL Fiddle demo

答案 1 :(得分:1)

首先,我建议像Philipp提到的那样进行重构: 使用这样一个表:

EMPLID   MONTH   VALUE
123      1       3
123      12      5

在这种情况下,它更容易查询:

SELECT [MONTH]
FROM YourTable
GROUP BY EMPLID, [MONTH]
HAVING VALUE > 0
AND MIN([MONTH]) = [MONTH]

如果您没有其他选择使用案例:

SELECT 
CASE 
    WHEN JAN > 0 THEN 'JAN'
    WHEN FEB > 0 THEN 'FEB'
    WHEN MAR > 0 THEN 'MAR'
    WHEN APR > 0 THEN 'APR'
    WHEN MAY > 0 THEN 'MAY'
    WHEN JUN > 0 THEN 'JUN'
    WHEN JUL > 0 THEN 'JUL'
    WHEN AUG > 0 THEN 'AUG'
    WHEN SEP > 0 THEN 'SEP'
    WHEN OCT > 0 THEN 'OCT'
    WHEN NOV > 0 THEN 'NOV'
    WHEN DEC > 0 THEN 'DEC'
    ELSE 'No Month found' 
END AS FirstMonth
FROM YourTable

答案 2 :(得分:0)

正如菲利普所说,最好为你的桌子使用不同的结构。 使用当前结构,您可以执行以下操作:

Select a.EMPLID, case when (select b.JAN from tbl b where a.EMPLID=b.EMPLID) > 0 then 'JAN' 
                      when.....etc(the same for each month).... end as Val
  from tbl a

可能这不是最佳解决方案,但应该有效。