![](/img/trans.png)
[英]How to use different column values from other table based on value on current table column in SQL server
[英]SQL Server 2000 - Returning a single column value from a 4 column table based on the values of the other 3 columns
我有一个下表,我想运行一个脚本为每个CARE_ID返回一个PLAN_ID值,这些是条件。 我该怎么做? 我正在用SQL Server 2005编写脚本,但是它必须与SQL Server 2000向后兼容。
CARE_ID
只有一个PLAN_ID
则返回该PLAN_ID
CARE_ID
具有多个PLAN_ID
且FIRST_TREATMENT_DATE
值为NULL
则返回最大值PLAN_ID
CARE_ID
有多个PLAN_ID
S和值FIRST_TREATMENT_DATE
不是NULL
然后返回PLAN_ID
,其具有最近的日期N5_2_MDT_DATE
我的计算表明该脚本将返回的PLAN_ID
值
1833,65,162,2929,67,93,44,1136,1046,1047,1048,1049,1050,1052,1870,2426
谢谢
PLAN_ID CARE_ID N5_2_MDT_DATE FIRST_TREATMENT_DATE
1833 1 20/08/2011 00:00 NULL
199 1 23/06/2010 00:00 NULL
65 4 27/11/2009 00:00 NULL
162 5 30/07/2010 00:00 NULL
54 5 15/11/2009 00:00 NULL
55 5 29/10/2009 00:00 NULL
63 5 03/09/2009 00:00 NULL
2929 9 29/01/2013 00:00 NULL
99 9 08/03/2010 00:00 NULL
95 9 04/02/2010 00:00 NULL
64 9 18/11/2009 00:00 NULL
67 106 14/01/2013 00:00 NULL
96 106 20/07/2009 00:00 NULL
93 107 23/02/2010 00:00 21/09/2012 00:00
44 108 25/12/2009 00:00 NULL
43 108 07/10/2009 00:00 NULL
1136 364 18/02/2011 00:00 19/02/2011 00:00
1122 364 26/01/2011 00:00 19/02/2011 00:00
1046 1661 25/01/2011 00:00 25/01/2011 00:00
1047 1662 25/01/2011 00:00 25/01/2011 00:00
1048 1663 25/01/2011 00:00 01/02/2011 00:00
1049 1665 25/01/2011 00:00 NULL
1050 1666 23/01/2011 00:00 01/02/2011 00:00
1052 1667 01/02/2011 00:00 01/02/2011 00:00
1870 1781 04/10/2010 00:00 10/02/2011 00:00
1869 1781 04/10/2010 00:00 10/02/2011 00:00
1868 1781 04/10/2010 00:00 10/02/2011 00:00
2426 2246 23/03/2012 00:00 01/07/2012 00:00
2275 2246 01/01/2012 00:00 01/07/2012 00:00
2170 2246 14/10/2011 00:00 01/07/2012 00:00
1784 2246 04/08/2011 00:00 01/07/2012 00:00
1940 2246 10/07/2011 00:00 01/07/2012 00:00
1637 2246 20/06/2011 00:00 01/07/2012 00:00
1539 2246 02/06/2011 00:00 01/07/2012 00:00
1538 2246 01/06/2011 00:00 01/07/2012 00:00
1536 2246 31/05/2011 00:00 01/07/2012 00:00
我没有2000实例,但是我认为我一直使用兼容的语言。 我假设对于第三个条件,不会有两个具有相同N5_2_MDT_DATE
计划。
实际上,我首先使用数据设置1然后是查询将其作为单个脚本运行,但是正在重新排列内容,以便首先出现实际答案:
select t1.CARE_ID,
CASE
--Cases one and two are identical, effectively
WHEN COUNT(*) = 1 OR MAX(t1.FIRST_TREATMENT_DATE) IS NULL
THEN MAX(t1.PLAN_ID)
ELSE MAX(CASE WHEN t1.N5_2_MDT_DATE = t2.LastDate THEN t1.PLAN_ID END)
END
from @t t1
inner join
(select CARE_ID,MAX(N5_2_MDT_DATE) as LastDate
from @t
group by CARE_ID
) t2
on t1.CARE_ID = t2.CARE_ID
group by t1.CARE_ID
您会注意到,我已经折叠了案例一和案例二,因为在只考虑一个计划的情况下,计算最高计划数没有什么害处。
此外,我们对案件106的返回计划也意见不一,但根据您列出的规则,我确定96是正确的,而不是67。
逻辑(大部分)全部集中在select的CASE
表达式中。 如果只有组或单排MAX(FIRST_TREATMENT_DATE)
在所有行是NULL
(如果该组中的所有行只能发生NULL
那么我们只返回MAX(PLAN_ID)
。
比较复杂的情况是第三种。 为了解决这个问题,我有一个子查询( t2
),它为每个CASE_ID
找到最高的N5_2_MDT_DATE
值。 然后,我们在另一个聚合中的CASE
表达式的ELSE
子句中使用它-我们试图确保只有在特定PLAN_ID
的N5_2_MDT_DATE
列与t2
找到的最高列匹配时,我们才真正考虑它-在每个组中仅应发生一次,如果我在上文第一段中概述的假设成立。
我认为,对于更高版本的SQL Server,CTE和ROW_NUMBER()
函数将使编写起来更加容易。
1我使用的表变量的数据设置。 如果要运行上述查询,它应该首先出现在查询窗口中:
declare @t table (PLAN_ID int not null, CARE_ID int not null,
N5_2_MDT_DATE datetime not null,FIRST_TREATMENT_DATE datetime null)
insert into @t(PLAN_ID,CARE_ID,N5_2_MDT_DATE,FIRST_TREATMENT_DATE)
SELECT 1833, 1 ,'20110820',NULL union all
SELECT 199 , 1 ,'20100623',NULL union all
SELECT 65 , 4 ,'20091127',NULL union all
SELECT 162 , 5 ,'20100730',NULL union all
SELECT 54 , 5 ,'20091115',NULL union all
SELECT 55 , 5 ,'20091029',NULL union all
SELECT 63 , 5 ,'20090903',NULL union all
SELECT 2929, 9 ,'20130129',NULL union all
SELECT 99 , 9 ,'20100308',NULL union all
SELECT 95 , 9 ,'20100204',NULL union all
SELECT 64 , 9 ,'20091118',NULL union all
SELECT 67 , 106 ,'20130114',NULL union all
SELECT 96 , 106 ,'20090720',NULL union all
SELECT 93 , 107 ,'20100223','20120921' union all
SELECT 44 , 108 ,'20091225',NULL union all
SELECT 43 , 108 ,'20091007',NULL union all
SELECT 1136, 364 ,'20110218','20110219' union all
SELECT 1122, 364 ,'20110126','20110219' union all
SELECT 1046, 1661 ,'20110125','20110125' union all
SELECT 1047, 1662 ,'20110125','20110125' union all
SELECT 1048, 1663 ,'20110125','20110201' union all
SELECT 1049, 1665 ,'20110125',NULL union all
SELECT 1050, 1666 ,'20110123','20110201' union all
SELECT 1052, 1667 ,'20110201','20110201' union all
SELECT 1870, 1781 ,'20101004','20110210' union all
SELECT 1869, 1781 ,'20101004','20110210' union all
SELECT 1868, 1781 ,'20101004','20110210' union all
SELECT 2426, 2246 ,'20120323','20120701' union all
SELECT 2275, 2246 ,'20120101','20120701' union all
SELECT 2170, 2246 ,'20111014','20120701' union all
SELECT 1784, 2246 ,'20110804','20120701' union all
SELECT 1940, 2246 ,'20110710','20120701' union all
SELECT 1637, 2246 ,'20110620','20120701' union all
SELECT 1539, 2246 ,'20110602','20120701' union all
SELECT 1538, 2246 ,'20110601','20120701' union all
SELECT 1536, 2246 ,'20110531','20120701'
我有点晚了,但是...
select Care_ID,
case when d.b is null then MAx(Plan_ID) else (select Distinct data.Plan_ID
from
(select max(N5_2_MDT_DATE) as N5_2_MDT_DATE
from data
group by CARE_ID) a
inner join data on data.N5_2_MDT_DATE = a.N5_2_MDT_DATE
Where d.Care_ID = data.Care_ID
) End as Plan_ID
from
(
select PLAN_ID, CARE_ID, Max(N5_2_MDT_DATE) as a, Max(FIRST_TREATMENT_DATE) as b
from data
group by PLAN_ID, CARE_ID
) d
Group by CARE_ID, d.b
演示: http : //sqlfiddle.com/#!3/ 834f6/ 53
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.