微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL CASE 表达式分组“问题”

如何解决SQL CASE 表达式分组“问题”

我正在尝试从表中获取一些数据,并查看记录是否存在于 1 年的块中。

主表是这样的

VM_HI_MAGIC VM_HI_DATEOUT VM_HI_HEVTYPE VM_HI_VEHICLE VM_HI_CODE_001
336338 2014-07-07 SER 116591 VHC
336493 2014-07-07 SER 116591 S01
336502 2014-07-07 SER 116591 S01
547889 2015-05-11 SER 116591 MOT
547891 2015-05-11 SER 116591 VHC
585385 2015-07-02 SER 116591 VHC
585509 2015-07-02 SER 116591 S01
585571 2015-07-02 SER 116591 S01
1313 NULL SER 116591 MEC
92364 2013-07-03 SER 116591 S01
92365 2013-07-03 SER 116591 VHC

生成这个的代码

SELECT VM_HI_MAGIC,VM_HI_DATEOUT,VM_HI_HEVTYPE,VM_HI_VEHICLE,VM_HI_CODE_001

FROM VM_00_HISTORY

WHERE VM_HI_HEVTYPE = 'SER' AND VM_HI_VEHICLE = 116591

到目前为止,我已经实现了以下

VM_HI_VEHICLE -7 -6 -5 -4 -3 -2 -1
116591 0 0 0 0 0 0 0
116591 0 1 0 0 0 0 0
116591 1 0 0 0 0 0 0

我使用以下代码实现了这一点

SELECT disTINCT
    VM_HI_VEHICLE,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year,-7,GETDATE()) AND DATEADD(year,-6,GETDATE()) THEN 1
        ELSE 0
    END AS '-7',-5,GETDATE()) THEN 1
        ELSE 0
    END AS '-6',-4,GETDATE()) THEN 1
        ELSE 0
    END AS '-5',-3,GETDATE()) THEN 1
        ELSE 0
    END AS '-4',-2,GETDATE()) THEN 1
        ELSE 0
    END AS '-3',-1,GETDATE()) THEN 1
        ELSE 0
    END AS '-2',GETDATE()) AND GETDATE() THEN 1
        ELSE 0
    END AS '-1'
  FROM VM_00_HISTORY

  WHERE VM_HI_VEHICLE = 116591  AND VM_HI_HEVTYPE = 'SER' AND VM_HI_CODE_001 LIKE 'S01'

我想要的输出

VM_HI_VEHICLE -7 -6 -5 -4 -3 -2 -1
116591 1 1 0 0 0 0 0

然后我可以从 VM_HI_VEHICLE 子句中删除 WHERE显示我们在过去 7 年内看到的所有汽车的列表,以查看留存率。

我尝试添加 GROUP BY VM_HI_VEHICLE 但这也需要包含 VM_HI_DATEOUT,因为它位于 CASE 表达式中,结果相同。

如何将所有 3 个输出记录组合在一起以提供所需的输出

感谢您的阅读。

解决方法

您似乎想要聚合:

SELECT VM_HI_VEHICLE,MAX(CASE WHEN VM_HI_DATEOUT between DATEADD(year,-7,GETDATE()) AND DATEADD(year,-6,GETDATE()) THEN 1
                ELSE 0
            END) AS [-7],-5,GETDATE()) THEN 1
                ELSE 0
          END) AS [-6],. . .
FROM VM_00_HISTORY
WHERE VM_HI_VEHICLE = 116591 AND VM_HI_HEVTYPE = 'SER' AND VM_HI_CODE_001 LIKE 'S01'
GROUP BY VM_HI_VEHICLE;

注意:我强烈建议您不要对列别名使用单引号。这只会导致混乱和难以调试的错误。

,

听起来您应该先按车辆分组,然后按年份分组(使用 year() 函数获取年份),然后在任何其他列上使用 count() 函数查看出现的记录数,然后将其显示为枢轴如果您必须按照格式化的方式格式化输出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。