Использование SQL для объединения подробных и агрегированных результатов - PullRequest
0 голосов
/ 21 мая 2019

Я разрабатываю отчет для базы данных SQL Server.Используя запрос, представленный здесь ...

SELECT
f.FacilityID as 'FID', 
COUNT (DISTINCT f.PhoneTypeID) as 'Ptypes', 
COUNT (DISTINCT f.PhoneID) as 'Pnumbers'
from dbo.FacilityPhones as f
inner join 
     dbo.Phones as ph
     f.PhoneID = ph.PhoneID
group by f.FacilityID 
having COUNT(DISTINCT f.PhoneTypeID)<>COUNT(DISTINCT f.PhoneId);

... Я идентифицировал 107 записей, в которых количество телефонных номеров, представленных для Учреждения, отличается от количества типов телефонных номеров (например, есть два разныхномера телефонов (оба указаны в качестве основных).
query results

Я хотел бы иметь возможность составить подробный отчет, в котором будут перечислены номера телефонов и типы телефонов для каждого учреждения,но ТОЛЬКО когда разные значения отличаются.

desired results

Есть ли способ сделать это с помощью одного запроса?Или мне нужно сохранить сводки во временную таблицу, а затем присоединиться к этой временной таблице, чтобы получить подробности?

1 Ответ

1 голос
/ 22 мая 2019

Не уверен, какие поля существуют в dbo.Phone;но предположим, что число оттуда ... Вероятно, нужно присоединиться к таблице типов, чтобы получить ее описание ...

При этом используется общее табличное выражение для получения базового списка элементов, а затем коррелированногоподзапрос, чтобы убедиться, что отображаются только те возможности в вашем cte.

WITH CTE AS (
SELECT f.FacilityID as 'FID'
     , COUNT (DISTINCT f.PhoneTypeID) as 'Ptypes'
     , COUNT (DISTINCT f.PhoneID) as 'Pnumbers'
FROM dbo.FacilityPhones as f
GROUP BY f.FacilityID 
HAVING COUNT(DISTINCT f.PhoneTypeID)<>COUNT(DISTINCT f.PhoneId))

SELECT *
FROM dbo.FaclityPhones FP
INNER JOIN dbo.Phones as ph
        ON FP.PhoneID = ph.PhoneID
WHERE EXISTS (SELECT 1 
              FROM CTE 
              WHERE FID = FP.FacilityID)

Здесь в предложении where только указываются те FacilityID's и связанные записи, если FacilityID существует в вашем исходном запросе (CTE) (107) Если мынужны данные из CTE, к которым мы бы присоединились;но поскольку это просто ограничивает данные, размещение их в предложении where и использование существует, вероятно, будет более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...