Я пробовал много решений и разные предложения WHERE. Я получаю COUNT из 20 строк, но точно есть 23 совпадающих строки.
Вот мой запрос:
DECLARE @CaseNum as NVARCHAR(12) = '19382006'
DECLARE @Enc as INTEGER = '717997'
DECLARE @START_Enc INTEGER
SET @START_Enc = (
SELECT MIN(Encounter_code)
FROM tblVisitLog
WHERE CaseNumber = @CaseNum
AND Discipline = 'PT'
AND VisitType <> 'M'
)
SET @Enc = (
SELECT Encounter_code
FROM tblVisitLog
WHERE Encounter_code = @Enc
AND Discipline = 'PT'
AND VisitType <> 'M'
)
SELECT COUNT(DISTINCT V.Encounter_code)
FROM tblVisitLog V
INNER JOIN tblScheduleData S
ON S.Encounter_code = V.Encounter_code
WHERE V.Encounter_code BETWEEN @START_Enc AND @Enc
AND V.CaseNumber = @CaseNum
AND V.Discipline = 'PT'
AND S.ItemType <> 'M'
AND S.Item_Status IN('V', 'C')
AND S.Item_Status NOT IN ('A', 'D', 'I', 'CA','CE','CC','CN','CS','CP','CD')
Ответ: +3, +2 или +1 от COUNT. Кажется, не существует числа, которое я мог бы просто добавить к COUNT.
Вот поля, которые я использую:
Очевидно, я делаю что-то не так. Пожалуйста помоги! Спасибо,
Собираем сейчас, 15 минут
Вы упоминаете 23 совпадающих ROWS, но затем выполняете COUNT(DISTINCT V.Encounter_Code). Вы уверены, что 23 совпадающие строки содержат 23 уникальных значения v.encounter_code? Почему бы не использовать count(*)?
Я вижу, что вы дважды ставите @Enc
. Второе задание использует запрос, который, похоже, может вернуть только существующее значение @Enc
. Помимо этого, общий метод отладки неожиданных значений COUNT()
заключается в изменении списка выбора, чтобы он просто возвращал подсчитываемые данные, включая первичные ключи или другую однозначно идентифицирующую информацию из исходных таблиц. Это должно дать вам доказательства, необходимые для диагностики вашей проблемы.
Я попробовал выполнить запрос с помощью COUNT(*), но число тоже неточное. Я пытаюсь устранить обманы, используя ключевое слово DISTINCT.
T N Я СЧИТАЮ ТОЛЬКО РАЗНЫЕ Encounter_Codes, я могу попробовать удалить второе определение @Enc, чтобы посмотреть, решит ли это проблему. Только что попробовал, тот же неправильный результат.
Кроме того, условие S.Item_Status IN ('V', 'C')
делает ненужным следующее условие S.Item_Status NOT IN (...)
. Возможно, вы намеревались только одно или другое?
Н. — Это еще одна из моих многочисленных попыток получить правильные результаты, NOT IN не нужен.
@ JackW9653 - JackW9653 - Вам следует добавить свои данные к исходному вопросу. Если вы не знакомы с форматированием уценки, вставьте то, что у вас есть для данных. Кто-нибудь может помочь с форматированием. Обязательно опубликуйте совпадающие данные из обеих исходных таблиц. В вашем предыдущем (теперь удаленном) комментарии было только tblScheduleData
. Также может потребоваться схема таблицы (определения столбцов). Наконец, обновите ожидаемые результаты, чтобы они соответствовали опубликованным образцам данных (в которых было всего 5 строк).
Н- спасибо, в таблицах было 42 строки, слишком много для публикации здесь.
@JackW9653 - Вы опубликовали tblScheduleData
, но еще не опубликовали соответствующие tblVisitLog
данные. Учитывая то, что у вас есть на данный момент, я сгенерировал макет tblVisitLog
и добавил его в эту db<>fiddle. В настоящее время обе таблицы имеют 20 строк, а результаты запроса показывают число = 20. Возможно, вы можете заменить данные tblVisitLog
в этой скрипте своими актуальными данными и опубликовать обновленный URL-адрес скрипта здесь.
Я переместил этот вопрос в stackoverflow.com/questions/78846179/…. Я пытался опубликовать поля, которые использовал, но они отображались неправильно, извините.
Если вы предоставите минимальный воспроизводимый пример с использованием DBFiddle, вы получите ответ гораздо быстрее, чем все эти комментарии для объяснения.
попробуйте упростить запрос, удалив INNER JOIN
и используя подзапрос в моем примере.
SELECT COUNT(DISTINCT V.Encounter_code)
FROM tblVisitLog V
WHERE V.Encounter_code BETWEEN @START_Enc AND @Enc
AND V.CaseNumber = @CaseNum
AND V.Discipline = 'PT'
AND EXISTS (
SELECT 1
FROM tblScheduleData S
WHERE S.Encounter_code = V.Encounter_code
AND S.ItemType <> 'M'
AND S.Item_Status IN('V', 'C')
AND S.Item_Status NOT IN ('A', 'D', 'I', 'CA','CE','CC','CN','CS','CP','CD')
);
это может помочь устранить проблему с объединением.
также вы можете дублировать, используя следующий запрос.
SELECT COUNT(*), Encounter_code
FROM tblVisitLog
GROUP BY Encounter_code
HAVING COUNT(*) > 1;
SELECT COUNT(*), Encounter_code
FROM tblScheduleData
GROUP BY Encounter_code
HAVING COUNT(*) > 1;
это поможет вам проверить, есть ли повторяющиеся строки в обеих таблицах.
Виджей – Ваше решение гораздо более элегантно, но я все еще получаю неточные значения COUNT. Были дубликаты, но они были многолетней давности и не учитывают текущие результаты.
Пожалуйста, предоставьте минимально воспроизводимый пример с данными образца и желаемыми результатами. В идеале предоставить образец данных в формате DDL+DML, чтобы мы могли просто скопировать его и запустить.