我有一个数据集,试图在其中找到以下内容: 如果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
我可以使用两个临时表来创建此表,一个临时表获取最大的startstatusdate,另一个临时表获取最大的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
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:2)
@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
,这应该将您想要的结果应用于声明的表{ {1}}