简体   繁体   English

SQL CASE 表达式分组“问题”

[英]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_MAGIC VM_HI_DATEOUT VM_HI_DATEOUT VM_HI_HEVTYPE VM_HI_HEVTYPE VM_HI_VEHICLE VM_HI_VEHICLE VM_HI_CODE_001 VM_HI_CODE_001
336338 336338 2014-07-07 2014-07-07 SER SER 116591 116591 VHC VHC
336493 336493 2014-07-07 2014-07-07 SER SER 116591 116591 S01 S01
336502 336502 2014-07-07 2014-07-07 SER SER 116591 116591 S01 S01
547889 547889 2015-05-11 2015-05-11 SER SER 116591 116591 MOT交通运输部
547891 547891 2015-05-11 2015-05-11 SER SER 116591 116591 VHC VHC
585385 585385 2015-07-02 2015-07-02 SER SER 116591 116591 VHC VHC
585509 585509 2015-07-02 2015-07-02 SER SER 116591 116591 S01 S01
585571 585571 2015-07-02 2015-07-02 SER SER 116591 116591 S01 S01
1313 1313 NULL NULL SER SER 116591 116591 MEC MEC
92364 92364 2013-07-03 2013-07-03 SER SER 116591 116591 S01 S01
92365 92365 2013-07-03 2013-07-03 SER SER 116591 116591 VHC 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 VM_HI_VEHICLE -7 -7 -6 -6 -5 -5 -4 -4 -3 -3 -2 -2 -1 -1
116591 116591 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116591 116591 0 0 1 1 0 0 0 0 0 0 0 0 0 0
116591 116591 1 1 0 0 0 0 0 0 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 VM_HI_VEHICLE -7 -7 -6 -6 -5 -5 -4 -4 -3 -3 -2 -2 -1 -1
116591 116591 1 1 1 1 0 0 0 0 0 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM