首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个条件下对复杂查询使用case-when

在多个条件下对复杂查询使用case-when
EN

Stack Overflow用户
提问于 2020-02-07 00:23:29
回答 1查看 55关注 0票数 0

我有以下数据:

代码语言:javascript
复制
    ID_LIFTING | ITEM | DATE
    ---------------------
    1101       | 6    | 2020-02-01
    1101       | 6    | 2020-02-02
    1101       | 6    | 2020-02-03
    1101       | 7    | 2020-02-01
    1101       | 7    | 2020-02-02
    1101       | 7    | 2020-02-03
    1102       | 6    | 2020-02-04
    1102       | 6    | 2020-02-04
    1102       | 7    | 2020-02-04
    1102       | 7    | 2020-02-04

我想要的是,在类似的ID_DATAITEM下,将有一列显示串联的日期范围为字符串'MIN(date) -MAX(Date)E 210‘。但是,如果在类似的ID_DATA下日期是相似的,那么它只会显示 date ,因为没有范围。

请注意,对于单个ID_DATA,可能有超过2行的DATE。我希望用案例-什么时候。

遵循预期结果

代码语言:javascript
复制
    ID_LIFTING | ITEM | DATE
    ---------------------
    1101       | 6    | 2020-02-01 - 2020-02-03
    1101       | 7    | 2020-02-01 - 2020-02-03
    1102       | 6    | 2020-02-04
    1102       | 7    | 2020-02-04

下面是我所做的查询。我的查询仍然不正确,我不知道该把正确的查询放在哪里对我的上述预期结果:(这是为ALD_DATE)。请注意,下面有许多联接来获取我需要的数据,如上面所示。ID_LIFTING在表参数D之后。

代码语言:javascript
复制
    SELECT DISTINCT ...
            )
        ,ALD_DATE = (SELECT CASE WHEN MIN(DATE) = MAX(DATE) THEN CAST(MIN(DATE) AS CHAR)
            ELSE CONCAT(MIN(DATE), ' - ', MAX(DATE)) 
       END AS DATE
FROM data
GROUP BY ID_LIFTING, ITEM
ORDER BY ID_LIFTING),

    FROM MYTABLE A
    LEFT JOIN ...;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-07 00:29:56

可以使用CASE表达式检查DATEMINMAX值是否相同。如果没有,则输出范围,否则输出单个值:

代码语言:javascript
复制
SELECT ID_LIFTING, ITEM,
       CASE WHEN MIN(DATE) = MAX(DATE) THEN CAST(MIN(DATE) AS CHAR)
            ELSE CONCAT(MIN(DATE), ' - ', MAX(DATE)) 
       END AS DATE
FROM data
GROUP BY ID_LIFTING, ITEM
ORDER BY ID_LIFTING

输出(用于样本数据):

代码语言:javascript
复制
ID_LIFTING  ITEM    DATE
1101        6       2020-02-01 - 2020-02-03
1101        7       2020-02-01 - 2020-02-03
1102        6       2020-02-04
1102        7       2020-02-04 

基于SQLFiddle的演示

在将其集成到查询中时,您需要使用窗口函数。

代码语言:javascript
复制
ALD_DATE = CASE WHEN MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) = MAX(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) THEN CAST(MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) AS CHAR) 
                ELSE CONCAT(MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM), ' - ', MAX(DATE) OVER (PARTITION BY ID_LIFTING, ITEM)) 
           END
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60105523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档