[英]SQL CASE expression grouping “issue”
I'm trying to get some data out of a table and look at if a record exists in 1 year chunks.我正在尝试从表中获取一些数据并查看记录是否存在于 1 年的块中。
The main table looks like this主表看起来像这样
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 ![]() |
The code the generate this was生成的代码是
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
So far, I've achieved the following到目前为止,我已经实现了以下
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 ![]() |
I got to this using the following code我使用以下代码解决了这个问题
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'
My desired output is我想要的 output 是
VM_HI_VEHICLE ![]() |
-7 ![]() |
-6 ![]() |
-5 ![]() |
-4 ![]() |
-3 ![]() |
-2 ![]() |
-1 ![]() |
---|---|---|---|---|---|---|---|
116591 ![]() |
1 ![]() |
1 ![]() |
0 ![]() |
0 ![]() |
0 ![]() |
0 ![]() |
0 ![]() |
I can then remove VM_HI_VEHICLE
from the WHERE
clause to display a list of all cars we're seen within the past 7 years to look at retention.然后,我可以从
WHERE
子句中删除VM_HI_VEHICLE
,以显示我们在过去 7 年内看到的所有汽车的列表,以查看留存情况。
I have attempted adding GROUP BY VM_HI_VEHICLE
but this needs VM_HI_DATEOUT
to be included as well due to it being in the CASE
expression, which leaves with the same result.我尝试添加
GROUP BY VM_HI_VEHICLE
但这需要VM_HI_DATEOUT
也包括在内,因为它位于CASE
表达式中,结果相同。
How can I group all 3 output records together to give the desired output?如何将所有 3 个 output 记录组合在一起以提供所需的 output?
Thank you for reading.感谢您的阅读。
You seem to want aggregation:你似乎想要聚合:
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;
Note: I strongly discourage you from using single quotes for column aliases.注意:我强烈建议您不要对列别名使用单引号。 This just causes confusion and hard-to-debug errors.
这只会导致混乱和难以调试的错误。
Sounds like you should be grouping by the vehicle then the year (use the year() function to get the year) then using the count() function on any other column to see how many records appear then present it as a pivot table if you must have the output formatted the way you have it formatted.听起来您应该按车辆然后年份分组(使用 year() function 来获取年份)然后在任何其他列上使用 count() function 来查看出现了多少条记录,然后将其呈现为 ZDCA758FD47FEEBCD3BBBB必须按照您的格式化方式格式化 output。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.