SQL CASE表达式分组"issue"

SQL CASE expression grouping "issue"

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

主要table看起来像这样

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'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -6, GETDATE()) AND DATEADD(year, -5, GETDATE()) THEN 1
        ELSE 0
    END AS '-6'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -5, GETDATE()) AND DATEADD(year, -4, GETDATE()) THEN 1
        ELSE 0
    END AS '-5'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -4, GETDATE()) AND DATEADD(year, -3, GETDATE()) THEN 1
        ELSE 0
    END AS '-4'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -3, GETDATE()) AND DATEADD(year, -2, GETDATE()) THEN 1
        ELSE 0
    END AS '-3'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -2, GETDATE()) AND DATEADD(year, -1, GETDATE()) THEN 1
        ELSE 0
    END AS '-2'
    ,CASE
        WHEN VM_HI_DATEOUT between DATEADD(year, -1, 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

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

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

如何将所有 3 个输出记录组合在一起以获得所需的输出?

感谢您的阅读。

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

您似乎想要聚合:

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],
       MAX(CASE WHEN VM_HI_DATEOUT between DATEADD(year, -6, GETDATE()) AND DATEADD(year, -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;

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