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;
注意:我强烈建议您不要对列别名使用单引号。这只会导致混乱和难以调试的错误。
我正在尝试从 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;
注意:我强烈建议您不要对列别名使用单引号。这只会导致混乱和难以调试的错误。