-3

我有 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。

4

3 回答 3

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 演示

于 2012-11-22T13:37:48.717 回答
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
于 2012-11-22T13:40:33.443 回答
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

可能这不是最好的解决方案,但它应该可以工作。

于 2012-11-22T13:41:39.823 回答