сравнить количество столбцов не распознано - PullRequest
0 голосов
/ 31 мая 2019

У меня есть несколько столбцов, значения которых зависят от сумм для информации о строке.Однако, когда я доберусь до оператора where, он не позволит мне сравнить эти значения, поэтому я смогу просто отобразить значения с проблемами.См. Комментарий *** в запросе на выдачу.

Вот так выглядит мой запрос:

SELECT 
    DISTINCT
    p.ID
    ,p.Last 
    ,p.First 
    ,SUM(distinct CASE WHEN pf.facility in ('S','H','E') then 1 ELSE 0 END) as facility_count 
    ,SUM(distinct CASE WHEN (fs.ques_id = 59 AND pf.facility in ('S','H','E') ) THEN 1 ELSE 0 END) AS sum_qst_59
    FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN dbo.ADD_ANSW fs ON p.id = fs.id 

WHERE 
    pf.Facility in ('s', 'h', 'e')
    AND
    pf.status in ('Active')
    AND
    facility_count != sum_qst_59 ***--this doesn't work. Says no such columns***

group by p.id, Last, First
order by Last

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

Другими словами, есть люди, которые принадлежат к нескольким учреждениям (которые я считаю своими учреждениями для каждого человека).Кроме того, я считаю, сколько раз у них есть ответ 59 для тех же самых средств.Затем я сравниваю количество, потому что они должны быть одинаковыми, если они ответили на все вопросы.Затем я нахожу, где счетчики не совпадают, поэтому мы можем это исправить.

* Обновление - я пробую то, что было предложено, но в нем есть ошибка

Incorrect syntax near keyword 'having'

SELECT 
    DISTINCT
    p.ID
    ,p.Last 
    ,p.First 
   --change in having and sum line below
    ,having SUM(distinct CASE WHEN pf.facility in ('S','H','E') then 1 ELSE 0 END) as facility_count 
<>
    SUM(distinct CASE WHEN (fs.ques_id = 59 AND pf.facility in ('S','H','E') ) THEN 1 ELSE 0 END) AS sum_qst_59
    FROM person p
inner JOIN person_facilities pf ON p.ID = pf.ID
LEFT JOIN dbo.ADD_ANSW fs ON p.id = fs.id 

WHERE 
    pf.Facility in ('s', 'h', 'e')
    AND
    pf.status in ('Active')

group by p.id, Last, First
order by Last

Обновление 2: Также пробовал следующий, но все еще неправильный синтаксис, имеющий -

   SELECT 
        DISTINCT
        p.ID
        ,p.Last 
        ,p.First 
        ,SUM(distinct CASE WHEN pf.facility in ('S','H','E') then 1 ELSE 0 END) as facility_count 
        ,SUM(distinct CASE WHEN (fs.ques_id = 59 AND pf.facility in ('S','H','E') ) THEN 1 ELSE 0 END) AS sum_qst_59
        FROM person p
    inner JOIN person_facilities pf ON p.ID = pf.ID
    LEFT JOIN dbo.ADD_ANSW fs ON p.id = fs.id 

    WHERE 
        pf.Facility in ('s', 'h', 'e')
        AND
        pf.status in ('Active')
       --change in having and sum line below
        AND --this has incorrect syntax near having
         having SUM(distinct CASE WHEN pf.facility in ('S','H','E') then 1 ELSE 0 END) 
<>
        SUM(distinct CASE WHEN (fs.ques_id = 59 AND pf.facility in ('S','H','E') ) THEN 1 ELSE 0 END) 

    group by p.id, Last, First
    order by Last

1 Ответ

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

Псевдонимы столбцов нельзя использовать для ссылки на выражения в предложении WHERE.Но даже если бы они могли, вы ошиблись, поскольку фильтры, которые должны иметь место после агрегирования, должны быть помещены в предложение HAVING.

Попробуйте:

...
HAVING sum(CASE
             WHEN pf.facility IN ('S','H','E') THEN
               1
             ELSE
               0
           END)
       <>
       sum(CASE
             WHEN fs.ques_id = 59
                  AND pf.facility IN ('S','H','E') THEN
               1
             ELSE
               0
           END)
...

sum(DISTINCT ...)кажется, не имеет смысла.И DISTINCT во внешнем SELECT также может быть бесполезным.

...