我有以下数据:
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_DATA和ITEM下,将有一列显示串联的日期范围为字符串'MIN(date) -MAX(Date)E 210‘。但是,如果在类似的ID_DATA下日期是相似的,那么它只会显示 date ,因为没有范围。
请注意,对于单个ID_DATA,可能有超过2行的DATE。我希望用案例-什么时候。
遵循预期结果
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之后。
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 ...;发布于 2020-02-07 00:29:56
可以使用CASE表达式检查DATE的MIN和MAX值是否相同。如果没有,则输出范围,否则输出单个值:
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输出(用于样本数据):
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的演示
在将其集成到查询中时,您需要使用窗口函数。
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))
ENDhttps://stackoverflow.com/questions/60105523
复制相似问题