Использование COUNT в SQL-запросе, но не получение точных результатов

Я пробовал много решений и разные предложения 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.

Вот поля, которые я использую:

Код_встречи Номер дела Дисциплина Item_Status Тип вещи 716946 19382006 г. ПТ В Э 717967 19382006 г. ПТ В Т 717969 19382006 г. ПТ В Т 717970 19382006 г. ПТ В Т 717971 19382006 г. ПТ В Т 717973 19382006 г. ПТ В Т 717974 19382006 г. ПТ С Т 717977 19382006 г. ПТ В Т 717978 19382006 г. ПТ В Т 717979 19382006 г. ПТ В Т 717980 19382006 г. ПТ В Т 717982 19382006 г. ПТ В Т 717983 19382006 г. ПТ В Т 717985 19382006 г. ПТ В Т 717986 19382006 г. ПТ В Т 717988 19382006 г. ПТ В Т 717991 19382006 г. ПТ В Т 717992 19382006 г. ПТ С Т 717995 19382006 г. ПТ В Т 717997 19382006 г. ПТ В Т

Очевидно, я делаю что-то не так. Пожалуйста помоги! Спасибо,

Пожалуйста, предоставьте минимально воспроизводимый пример с данными образца и желаемыми результатами. В идеале предоставить образец данных в формате DDL+DML, чтобы мы могли просто скопировать его и запустить.

Dale K 08.08.2024 01:32

Собираем сейчас, 15 минут

JackW9653 08.08.2024 01:37

Вы упоминаете 23 совпадающих ROWS, но затем выполняете COUNT(DISTINCT V.Encounter_Code). Вы уверены, что 23 совпадающие строки содержат 23 уникальных значения v.encounter_code? Почему бы не использовать count(*)?

tinazmu 08.08.2024 01:41

Я вижу, что вы дважды ставите @Enc. Второе задание использует запрос, который, похоже, может вернуть только существующее значение @Enc. Помимо этого, общий метод отладки неожиданных значений COUNT() заключается в изменении списка выбора, чтобы он просто возвращал подсчитываемые данные, включая первичные ключи или другую однозначно идентифицирующую информацию из исходных таблиц. Это должно дать вам доказательства, необходимые для диагностики вашей проблемы.

T N 08.08.2024 01:45

Я попробовал выполнить запрос с помощью COUNT(*), но число тоже неточное. Я пытаюсь устранить обманы, используя ключевое слово DISTINCT.

JackW9653 08.08.2024 01:47

T N Я СЧИТАЮ ТОЛЬКО РАЗНЫЕ Encounter_Codes, я могу попробовать удалить второе определение @Enc, чтобы посмотреть, решит ли это проблему. Только что попробовал, тот же неправильный результат.

JackW9653 08.08.2024 01:51

Кроме того, условие S.Item_Status IN ('V', 'C') делает ненужным следующее условие S.Item_Status NOT IN (...). Возможно, вы намеревались только одно или другое?

T N 08.08.2024 01:57

Н. — Это еще одна из моих многочисленных попыток получить правильные результаты, NOT IN не нужен.

JackW9653 08.08.2024 01:59

@ JackW9653 - JackW9653 - Вам следует добавить свои данные к исходному вопросу. Если вы не знакомы с форматированием уценки, вставьте то, что у вас есть для данных. Кто-нибудь может помочь с форматированием. Обязательно опубликуйте совпадающие данные из обеих исходных таблиц. В вашем предыдущем (теперь удаленном) комментарии было только tblScheduleData . Также может потребоваться схема таблицы (определения столбцов). Наконец, обновите ожидаемые результаты, чтобы они соответствовали опубликованным образцам данных (в которых было всего 5 строк).

T N 08.08.2024 02:04

Н- спасибо, в таблицах было 42 строки, слишком много для публикации здесь.

JackW9653 08.08.2024 02:27

@JackW9653 - Вы опубликовали tblScheduleData, но еще не опубликовали соответствующие tblVisitLog данные. Учитывая то, что у вас есть на данный момент, я сгенерировал макет tblVisitLog и добавил его в эту db<>fiddle. В настоящее время обе таблицы имеют 20 строк, а результаты запроса показывают число = 20. Возможно, вы можете заменить данные tblVisitLog в этой скрипте своими актуальными данными и опубликовать обновленный URL-адрес скрипта здесь.

T N 08.08.2024 03:05

Я переместил этот вопрос в stackoverflow.com/questions/78846179/…. Я пытался опубликовать поля, которые использовал, но они отображались неправильно, извините.

JackW9653 08.08.2024 03:09

Если вы предоставите минимальный воспроизводимый пример с использованием DBFiddle, вы получите ответ гораздо быстрее, чем все эти комментарии для объяснения.

Dale K 08.08.2024 04:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
13
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

попробуйте упростить запрос, удалив 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. Были дубликаты, но они были многолетней давности и не учитывают текущие результаты.

JackW9653 08.08.2024 02:21

Другие вопросы по теме