Построить инструкцию SQL для получения count () конкретных записей в одной и той же таблице

Ранее я задавал вопрос об этом, но должен признать, что он предвзято относится к SQL-решениям, и теперь я не могу найти вопрос, поэтому я попробую еще раз, аккуратно сформулирую его и буду более открытым для любых предлагаемых решений.

У меня две таблицы:

tblCurrent Ref | CustomerID | ... .. .. . . | X001 X002 X003 tblHistorical Ref | ... .. .. . . | Missing | Matched X001 | ... .. .. . . | TRUE | FALSE X001 | ... .. .. . . | FALSE | FALSE X002 | ... .. .. . . | TRUE | TRUE X002 | ... .. .. . . | TRUE | FALSE X003 | ... .. .. . . | FALSE | FALSE X003 | ... .. .. . . | TRUE | TRUE 

Ref уникален в tblCurrent, но не в историческом.

Как я могу построить представление, основанное на tblCurrent, которое приводит к трем дополнительным столбцам, которые подсчитывают количество записей в tblHistorical, которые:

  • совпадение с Ref AND Missing является TRUE

  • совпадение с Ref AND Missing является ложным

  • совпадают с Ref AND Matchched True

Обратите внимание, что мне нужно будет добавить дополнительные столбцы, которые подсчитывают количество записей в tblHistorical на основе аналогичных критериев.

Я думаю, вам нужно использовать LEFT JOIN для этого, так как возможно, что tblHistorical ref может не существовать на tblHistorical table.

 SELECT a.ref, SUM(CASE WHEN b.Missing = 'True' THEN 1 ELSE 0 END) missingTrue, SUM(CASE WHEN b.Missing = 'False' THEN 1 ELSE 0 END) missingFalse, SUM(CASE WHEN b.Matched = 'True' THEN 1 ELSE 0 END) matchTrue FROM tblCurrent a LEFT JOIN tblHistorical b on a.ref = b.ref GROUP BY a.ref 
 SELECT R.Ref, SUM(CASE WHEN H.Missing = TRUE THEN 1 ELSE 0 END) as MissingTrue, SUM(CASE WHEN H.Missing = FALSE THEN 1 ELSE 0 END) as MissingFalse, SUM(CASE WHEN H.Matched = TRUE THEN 1 ELSE 0 END) as MatchedTrue FROM tblRef R JOIN tblHistorical H ON R.Ref = H.Ref 
 SELECT R.Ref, SUM(CASE WHEN H.Missing = TRUE THEN 1 ELSE 0 END) as MissingTrue, SUM(CASE WHEN H.Missing = FALSE THEN 1 ELSE 0 END) as MissingFalse, SUM(CASE WHEN H.Matched = TRUE THEN 1 ELSE 0 END) as MatchedTrue FROM tblRef R INNER JOIN tblHistorical H ON R.Ref = H.Ref Group by R.Ref 
 SELECT T.REF, COUNT(CASE WHEN H.MISSING = 'TRUE' THEN 1 END) AS MISSINGTRUE, COUNT(CASE WHEN H.MISSING = 'FALSE' THEN 1 END) AS MISSINGFALSE, COUNT(CASE WHEN H.MATCHED = 'TRUE' THEN 1 END) AS MATCHEDTRUE FROM TBLREF T JOIN TBLHISTORICAL H ON R.REF = H.REF GROUP BY T.REF 
Interesting Posts

Проблемы с производительностью при шифровании и расшифровке

SQL Server: добавляет значения небольших таблиц к значениям большой таблицы, не теряя размеры большой таблицы?

Robotframework + JayDeBeApi + SQLServer предоставляет SQLServerException: не может вызвать операцию отката, если для режима AutoCommit установлено значение «true»,

Как изменить / преобразовать значения в Output, которые поступают из таблицы SQL Server

«Неправильный синтаксис рядом с ключевым словом« WITH »в функции, возвращающей XML с выражением CTE

Вычисление различий даты между записями

Как я могу получить сопоставление конкретной таблицы в базе данных?

SQL-DMO: вы должны использовать инструменты управления SQL Server 2005 для подключения к этому серверу

Не удается подключиться к базе данных Azure SQL из Visual Studio

Таблица календаря для хранилища данных

Установление отношения «один-много» между двумя таблицами

Выполнение SQL-скрипта после сборки или регистрации SSIS

Как сделать поворот в сочетании с FOR XML PATH в SQL Server?

Найти наборы с повторяющимися полями и объединить их в одну таблицу

Обнаружение / мониторинг проблем с параметризацией

Давайте будем гением компьютера.