Sql 将日期的最小值和最大值返回到一个带条件的列中
我的数据如下所示:Sql 将日期的最小值和最大值返回到一个带条件的列中,sql,sql-server,Sql,Sql Server,我的数据如下所示: ID_DATA | DATE -------------------- 1101 | 2020-02-01 1101 | 2020-02-02 1101 | 2020-02-03 1102 | 2020-02-01 1102 | 2020-02-01 我想要的是,在类似的ID\u数据下,将有一列显示连接的日期范围,作为字符串“MIN(date)-MAX(date)”。但是,如果在相似的ID\u数据下,日期是相似的,它将只按原样显示日期 请注意,
ID_DATA | DATE
--------------------
1101 | 2020-02-01
1101 | 2020-02-02
1101 | 2020-02-03
1102 | 2020-02-01
1102 | 2020-02-01
我想要的是,在类似的ID\u数据下,将有一列显示连接的日期范围,作为字符串“MIN(date)-MAX(date)”。但是,如果在相似的ID\u数据下,日期是相似的,它将只按原样显示日期
请注意,单个ID\u数据可能有两行以上的DATE。我希望在需要时使用case
预期结果如下:
ID_DATA DATE
1101 2020-02-01 - 2020-02-03
1102 2020-02-01
尝试此选项:
SELECT
ID_DATA,
CONVERT(varchar, MIN(DATE), 111) +
CASE WHEN MIN(DATE) < MAX(DATE)
THEN ' - ' + CONVERT(varchar, MAX(DATE), 111)
ELSE '' END AS DATE
FROM yourTable
GROUP BY
ID_DATA;
选择
ID_数据,
转换(varchar,最小值(日期),111)+
最小(日期)小于最大(日期)时的情况
然后'-'+转换(varchar,MAX(DATE),111)
否则“”将以日期结束
从你的桌子上
分组
ID_数据;
这里的逻辑是使用
CASE
表达式检查ID的最小日期是否小于最大日期。如果是,则显示上限,否则只报告最小日期。您可以使用min()
和max()
函数尝试以下操作
WITH cte (
ID_DATA
,MinDate
,MaxDate
)
AS (
SELECT ID_DATA
,Min(DtDATE) AS MinDate
,Max(DtDATE) AS MaxDate
FROM TblData
GROUP BY ID_DATA
)
SELECT ID_DATA
,CASE
WHEN MinDate = MaxDate
THEN Convert(VARCHAR(10), MinDate)
ELSE Convert(VARCHAR(10), MinDate) + ' - ' + Convert(VARCHAR(10), MaxDate)
END AS DatePeriod
FROM cte
这是现场演示。hi@Tim我试过了,但显示错误。我已经在上面发布了我的示例查询。你能帮我怎么写你的代码吗?感谢这不是您之前所问的,并且与示例数据和预期输出不匹配。我们需要所有相关表的脚本来测试查询是否在语法检查中通过,运行并给出预期的输出。您能帮我告诉代码放在哪里吗,?因为在查询中加入后,我只需要表C中的ID_提升和BL_日期数据。。我试图在基于该ID的情况下说明问题,但总是失败