找到满足条件的第一列

时间:2016-07-07 13:03:59

标签: sql ms-access

我会尽力说清楚。

首先,我不负责数据库设计,也无法改变任何相关内容。

我的问题有点奇怪,我无法找到一个好的解决方案。

我们来看这个数据库示例

MAKE     MODEL     CY_2015     CY_2016     CY_2017     CY_2018     CY_2019      ...  

Nissan   xxxx      0           0           0           15475       1425723      ...
Ford     xx        0           0           75542       82317       12454        ...
...

这是我想要的输出

MAKE     MODEL     START_YEAR

Nissan   xxxx      2018
Ford     xx        2017
...

我不知道你是否注意到我是如何构建输出的:事实上,我想得到模型和他们的“开始年份”。 我们以第一个模型为例。

  • 日产xxxx每次都有“0”(CY_2015,CY_2016和CY_2017为“0”),直到“CY_2018”不再为“0”,所以“2018”是“开始年份”。

  • 福特xx每次都有“0”(CY_2015,CY_2016为“0”),直到“CY_2017”不再为“0”,因此“2017”是“开始年份”。

    < / LI>

基本上我没有任何想法,因为我不知道如何执行这样的查询(或者至少可以帮助我接近我想要的输出的东西),所以请原谅我。

请注意,DBMS是Access,因为我知道它可能带来问题。

2 个答案:

答案 0 :(得分:3)

我的建议类似于Gordon的,除了我更喜欢一个Switch表达式而不是多个嵌套的IIf表达式。

SELECT
    MAKE,
    MODEL,
    Switch
        (
            CY_2006 > 0, 2006,
            CY_2007 > 0, 2007,
            CY_2008 > 0, 2008,
            ... etc ...
            CY_2023 > 0, 2023,
            True, Null
        ) AS START_YEAR

Switch从第一个条件,值对返回,其中条件评估为True,并忽略其余对

最后一个条件,值对(True, Null)意味着当前面的条件都不为True时,START_YEAR将为空。

答案 1 :(得分:1)

您可以使用大量嵌套iif()语句执行此操作:

select make, model,
       iif(cy_2015 > 0, '2015',
           iif(cy_2016 > 0, '2016'
               iif(cy_2017 > 0, '2017'
                   iif(cy_2018 > 0, '2018'
                       iif(cy_2019 > 0, '2019')
                      )
                  )
              )
          ) as start_year

但是,在生成您正在使用的数据的查询中,这可能会更容易。