Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中使用Case语句更新表_Sql_Sql Server_Sql Server 2012_Ssms - Fatal编程技术网

在SQL中使用Case语句更新表

在SQL中使用Case语句更新表,sql,sql-server,sql-server-2012,ssms,Sql,Sql Server,Sql Server 2012,Ssms,我正在尝试将0、1或null添加到特定类别的列中,其中人员的相对personID具有诊断日期到人员的服务日期。这是我的桌子: DROP TABLE ICDCodes_w; GO CREATE TABLE ICDCodes_w ( AnxietyDisorder VARCHAR(6), DepressiveDisorder VARCHAR(6), PTSD VARCHAR(6) ); INSERT INTO ICDCodes_w ( AnxietyDisor

我正在尝试将0、1或null添加到特定类别的列中,其中
人员的
相对personID
具有
诊断日期
人员的
服务日期
。这是我的桌子:

 DROP TABLE ICDCodes_w;
 GO
 CREATE TABLE ICDCodes_w
(
    AnxietyDisorder VARCHAR(6),
    DepressiveDisorder VARCHAR(6),
    PTSD VARCHAR(6)
);

INSERT INTO ICDCodes_w
(
    AnxietyDisorder,
    DepressiveDisorder,
    PTSD
)
VALUES
('293.84', '296.2', '309.81'),
('300', '296.21', 'F43.1'),
('305.42', 'F11.28', 'F31.76'),
('305.81', 'F43.8', 'F31.78'),
('F40.00', 'F43.10', '305.52');
GO
DROP TABLE DiagHX_w;
GO
CREATE TABLE DiagHX_w
(
    ArchiveID VARCHAR(10),
    RelativePersonID VARCHAR(10),
    ICDCode VARCHAR(6), 
    DiagDate DATE 
);

INSERT INTO DiagHX_w
(
    ArchiveID,
    RelativePersonID,
    ICDCode, 
    DiagDate
)
VALUES
('1275741', '754241', '293.84', '1989-01-03'),
('2154872', '754241', '293.84', '1995-04-07'),
('4587215', '754241', '998.4', '1999-12-07'),
('4588775', '711121', 'F11.28', '2001-02-07'),
('3545455', '711121', NULL, NULL),
('9876352', '323668', '400.02', '1988-04-09'),
('3211514', '112101', 'F31.78', '2005-09-09'),
('3254548', '686967', 'F40.00', '1999-12-31'),
('4411144', '686967', '305.52', '2000-01-01'),
('6548785', '99999999','F40.00', '2000-02-03');
GO
DROP TABLE PatientFlags_w;
GO
CREATE TABLE PatientFlags_w
(
    PersonID VARCHAR(10),
    RelativePersonID VARCHAR(10),
    AnxietyDisorder VARCHAR(2),
    DepressiveDisorder VARCHAR(2),
    PTSD VARCHAR(2),
);

INSERT INTO PatientFlags_w
(
    PersonID,
    RelativePersonID
)
VALUES
('99999999', '754241'),
('88888888', '754241'),
('77777777', '754241'),
('66666666', '711121'),
('55555555', '711121'),
('44444444', '323668'),
('33333333', '112101'),
('22222222', '686967'),
('11111111', '686967'),
('32151111', '887878'),
('78746954', '771125'),
('54621333', '333114'),
('55648888', '333114');
GO
DROP TABLE Person_w;
GO
CREATE TABLE Person_w
(
    PersonID VARCHAR(10),
    ServiceDate date
);

INSERT INTO Person_w
(
    PersonID,
    ServiceDate
)
VALUES
('99999999', '2000-12-31'),
('88888888', '2000-11-01'),
('69876541', '2000-09-04'),
('66666666', '2000-01-15'),
('55555555', '2000-07-22'),
('44444444', '2000-07-20'),
('65498711', '2000-11-17'),
('22222222', '2000-09-02'),
('11111111', '2000-02-04'),
('32151111', '2000-02-17'),
('78746954', '2000-03-29'),
('54621333', '2000-08-22'),
('55648888', '2000-10-20');
以下是我的更新声明:

UPDATE a
SET AnxietyDisorder = CASE
                      WHEN ICDCode IN
                           (
                               SELECT AnxietyDisorder FROM 
                               Project..ICDCodes_w
                           ) THEN
                          1
                      ELSE
                          0
                  END,
DepressiveDisorder = CASE
                         WHEN ICDCode IN
                              (
                                  SELECT DepressiveDisorder FROM 
                                  Project..ICDCodes_w
                              ) THEN
                             1
                         ELSE
                             0
                     END,
PTSD = CASE
           WHEN ICDCode IN
                (
                    SELECT PTSD FROM Project..ICDCodes_w
                ) THEN
               1
           ELSE
               0
       END
FROM PatientFlags_w a
JOIN DiagHX_w b
    ON a.relativepersonid = b.RelativePersonID
JOIN Person_w p 
ON a.personid = p.PersonID
WHERE diagdate <= p.servicedate; 

前几天我确实问过这个问题,但是我的样本表都搞乱了,所以这次我已经验证了它们的有效性

乍一看,查询的问题在于您多次更新目标(PatientFlags_w):每个标志更新一次。在某些情况下,你似乎得到了正确的结果,但这只是运气

很难说您想要在flag表中每人一行,还是每个flag一行

您是否可以查看这些查询,并告知我们它们是否接近您想要的结果:

-- If you want one row per Person:
select  RelativePersonID, 
        [AnxietyDisorder] = max(case when c.AnxietyDisorder is not null then 1 else 0 end),
        [DepressiveDisorder] = max(case when c.DepressiveDisorder is not null then 1 else 0 end),
        [PTSD] = max(case when c.PTSD is not null then 1 else 0 end)
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD)
group
by      RelativePersonID;


-- If you want one row per Flag:
select  RelativePersonID, 
        d.ICDCode,
        [AnxietyDisorder] = case when c.AnxietyDisorder is not null then 1 else 0 end,
        [DepressiveDisorder] = case when c.DepressiveDisorder is not null then 1 else 0 end,
        [PTSD] = case when c.PTSD is not null then 1 else 0 end
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD);
如果诊断彼此不相关(我假设它们在同一个表中),您可能需要这样做:

select  RelativePersonID, 
        [AnxietyDisorder] = max(case when c.AnxietyDisorder = d.ICDCode then 1 else 0 end),
        [DepressiveDisorder] = max(case when c.DepressiveDisorder = d.ICDCode then 1 else 0 end),
        [PTSD] = max(case when c.PTSD = d.ICDCode then 1 else 0 end)
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD)
group
by      RelativePersonID;

乍一看,查询的问题在于您多次更新目标(PatientFlags_w):每个标志更新一次。在某些情况下,你似乎得到了正确的结果,但这只是运气

很难说您想要在flag表中每人一行,还是每个flag一行

您是否可以查看这些查询,并告知我们它们是否接近您想要的结果:

-- If you want one row per Person:
select  RelativePersonID, 
        [AnxietyDisorder] = max(case when c.AnxietyDisorder is not null then 1 else 0 end),
        [DepressiveDisorder] = max(case when c.DepressiveDisorder is not null then 1 else 0 end),
        [PTSD] = max(case when c.PTSD is not null then 1 else 0 end)
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD)
group
by      RelativePersonID;


-- If you want one row per Flag:
select  RelativePersonID, 
        d.ICDCode,
        [AnxietyDisorder] = case when c.AnxietyDisorder is not null then 1 else 0 end,
        [DepressiveDisorder] = case when c.DepressiveDisorder is not null then 1 else 0 end,
        [PTSD] = case when c.PTSD is not null then 1 else 0 end
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD);
如果诊断彼此不相关(我假设它们在同一个表中),您可能需要这样做:

select  RelativePersonID, 
        [AnxietyDisorder] = max(case when c.AnxietyDisorder = d.ICDCode then 1 else 0 end),
        [DepressiveDisorder] = max(case when c.DepressiveDisorder = d.ICDCode then 1 else 0 end),
        [PTSD] = max(case when c.PTSD = d.ICDCode then 1 else 0 end)
from    DiagHX_w d
left 
join    ICDCodes_w c on d.ICDCode in (c.AnxietyDisorder, c.DepressiveDisorder, c.PTSD)
group
by      RelativePersonID;

“这对某些值有效,但也有一些值无法更新”好的,哪些值有效,哪些值无效?当某些东西没有得到更新时,您希望更新什么以及更新到什么?欢迎使用SO。您的查询,至少是案例陈述,看起来不错。如果存在行不更新的问题,则与连接或where有关。我注意到diagdate上有一些空值;也许您希望改为isnull(diagdate,'19000101')?“这对某些值有效,但也有一些值无法更新”好的,它对哪些值有效,哪些值无效?当某些东西没有得到更新时,您希望更新什么以及更新到什么?欢迎使用SO。您的查询,至少是案例陈述,看起来不错。如果存在行不更新的问题,则与连接或where有关。我注意到diagdate上有一些空值;也许你想要isnull(diagdate,'19000101')?嗨,谢谢你。如果relativepersonid有过诊断,我只希望标志为“1”,所以我只希望每个标志有一行。第一个查询更接近我想要的,但是当我运行它时,看起来我仍然得到误报,反之亦然。第一个查询是每人一行。帮我找出第一个问题中的假阳性。对不起,你是对的。我只想要每人一排。因此,如果患者的三个诊断都标记为“1”,我只需要一行。选择a.相对人格障碍,a.焦虑障碍,a.抑郁障碍,a.创伤后应激障碍,b.icdcode FROM Project..PatientFlags_w a JOIN Project..a.RelativePersonID=b.RelativePersonID JOIN Project..a.PersonID=p.PersonID=p.PersonID JOIN Project..ICDCodes_w i ON b.icdcode=i.PTSD--只有relativepersonid=686967应该有PTSD=1I添加第三个查询,这可能会让我们更接近。我以为ICDcodes是相互关联的嗨,谢谢你。如果relativepersonid有过诊断,我只希望标志为“1”,所以我只希望每个标志有一行。第一个查询更接近我想要的,但是当我运行它时,看起来我仍然得到误报,反之亦然。第一个查询是每人一行。帮我找出第一个问题中的假阳性。对不起,你是对的。我只想要每人一排。因此,如果患者的三个诊断都标记为“1”,我只需要一行。选择a.相对人格障碍,a.焦虑障碍,a.抑郁障碍,a.创伤后应激障碍,b.icdcode FROM Project..PatientFlags_w a JOIN Project..a.RelativePersonID=b.RelativePersonID JOIN Project..a.PersonID=p.PersonID=p.PersonID JOIN Project..ICDCodes_w i ON b.icdcode=i.PTSD--只有relativepersonid=686967应该有PTSD=1I添加第三个查询,这可能会让我们更接近。我假设ICDcodes是相互关联的