问题描述
我正在尝试从表中获取一些数据,并查看记录是否存在于 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
表达式中,结果相同。
感谢您的阅读。
解决方法
您似乎想要聚合:
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() 函数查看出现的记录数,然后将其显示为枢轴如果您必须按照格式化的方式格式化输出。