#sql #sql-server #sql-server-2012 #ssms
#sql #sql-сервер #sql-server-2012 #ssms
Вопрос:
Я пытаюсь добавить 0, 1 или null к столбцу в определенной категории, где a relativepersonid
из a person
имеет значение diagdate
до person
‘s servicedate
. Вот мои таблицы:
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;
Это работает с некоторыми значениями, но есть некоторые, которые не обновляются. Я знаю, что проблема связана с моим оператором case и, вероятно, с проблемой объединения. Какой лучший способ написать это? Вот пример запроса, который я использовал для проверки. В PTSD
столбце должно быть значение 1.
SELECT * FROM project..patientflags_w a
JOIN project..diaghx_w b
ON a.relativepersonid = b.RelativePersonID
JOIN project..person_w p
ON a.personid = p.personid
WHERE b.icdcode IN (SELECT PTSD FROM Project..ICDCodes_w)
AND b.diagdate <= p.servicedate
Я действительно задавал этот вопрос на днях, но все мои примеры таблиц были перепутаны, поэтому я убедился, что на этот раз они работают.
Комментарии:
1. «Это работает с некоторыми значениями, но есть некоторые, которые не обновляются» Хорошо, с какими из них это работает, а с какими нет? Когда что-то не обновляется, что вы ожидаете обновить и для чего?
2. Добро пожаловать в SO. Ваш запрос, по крайней мере, операторы case, выглядят нормально. Если есть проблема с тем, что строки не обновляются, это связано с объединениями или where. Я замечаю некоторые значения null в diagdate; может быть, вы хотите вместо этого isnull(diagdate,’19000101′)?
Ответ №1:
На первый взгляд, проблема с вашим запросом заключается в том, что вы обновляете цель (PatientFlags_w) несколько раз: по одному разу для каждого флага. В некоторых случаях вы, кажется, получаете правильный результат, но это просто удача.
Трудно сказать, требуется ли вам по одной строке на пользователя в таблице флагов или по одной строке на флаг.
Можете ли вы просмотреть эти запросы и сообщить нам, близки ли они к желаемым результатам:
-- 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;
Комментарии:
1. Привет, спасибо тебе за это. Я просто хочу, чтобы флаг был равен ‘1’, если у relativepersonid КОГДА-либо был диагноз, поэтому я бы хотел просто одну строку на флаг. Первый запрос ближе к тому, что я хочу, но когда я его запускаю, похоже, что я все еще получаю ложные срабатывания, и наоборот.
2. Первый запрос — это одна строка на пользователя . Помогите мне обнулить ложное срабатывание в первом запросе.
3. Извините, вы правы. Мне просто нужна одна строка на человека. Итак, если бы у человека были все три диагноза, помеченные как ‘1’, я бы хотел просто одну строку.
4. ВЫБЕРИТЕ.relativepersonid,.anxietydisorder, .depressivedisorder, .ptsd, b.icdcode ИЗ Project..PatientFlags_w для ПРИСОЕДИНЕНИЯ к проекту.. DiagHX_w b НА a.RelativePersonID = b.RelativePersonID ПРИСОЕДИНЯЕТСЯ К проекту.. Person_w p В проекте присоединения.PersonID = p.PersonID.. ICDCodes_w i В b.ICDCode = i.PTSD; —только relativepersonid = 686967 должен иметь PTSD = 1
5. Я добавил третий запрос, который может приблизить нас. Я предполагал, что ICDcodes были связаны друг с другом