我有一个数据集,我试图找到以下内容:如果statusid = 113917,那么我想找到最大日期并称之为“startstatusdate”。如果statusid = 49938,那么我找到最大日期并称之为“endstatusdate”。
declare @t table(practid int, statusid int, statusdate date)
insert into @t values (1, 113917, '2018-03-01'),
(1, 113917, '2018-04-01'),
(1, 113917, '2018-05-01'),
(1, 49938, '2018-06-01'),
(2, 113917, '2018-03-15'),
(2, 113917, '2018-03-18'),
(2, 49938, '2018-04-22')
我想要一个这样的结果:
practid startstatusdate endstatusdate
1 2018-03-01 2018-06-01
2 2018-03-15 2018-04-22
我可以使用两个临时表创建它,一个获取max startstatusdate,另一个获取max endstatusdate,然后加入这些表。但是我想在一个查询中执行此操作。
我正在尝试这样的事情:
Select practid,
(select max(statusdate)
from Table A
where statusid = 113917) as startstatusdate,
(select max(statusdate)
from Table A
where statusid = 49938) as endstatusdate
from Table A
group by practid
您可以使用case
表达式仅采用相关状态中的值:
SELECT practid,
MAX(CASE statusid WHEN 113917 THEN statusdate END) AS startstatusdate,
MAX(CASE statusid WHEN 49938 THEN statusdate END) AS endstatusdate
FROM table_a
GROUP BY practid
@JNevill所说的是正确的,这是一个简单的CASE陈述。
DECLARE @T TABLE(PRACTID INT, STATUSID INT, STATUSDATE DATE)
INSERT INTO @T VALUES (1, 113917, '2018-03-01'),
(1, 113917, '2018-04-01'),
(1, 113917, '2018-05-01'),
(1, 49938, '2018-06-01'),
(2, 113917, '2018-03-15'),
(2, 113917, '2018-03-18'),
(2, 49938, '2018-04-22')
SELECT PRACTID,
MIN(CASE STATUSID WHEN 113917 THEN STATUSDATE END) AS STARTSTATUSDATE,
MAX(CASE STATUSID WHEN 49938 THEN STATUSDATE END) AS ENDSTATUSDATE
FROM @T
GROUP BY PRACTID
注意:(根据您想要的结果)看起来您想使用MIN
作为startstatusdate
,这应该将您想要的结果应用于您声明的表格@t