drvfn Ответов: 3

Как я могу исключить 0 результатов


У меня есть такой запрос

select 
a.Des as 'Alm', 
SUM (case k.IdE when 1 then 1 else 0 end) as Normal, 
SUM (case  k.IdE when 2 then 1 else 0 end) as Urgent  
FROM TblKBA a 
left join TblKBK k 
on a.idA = k.IdAr
group by a.Des 


с этим результатом

Alm	Normal	Urgent
U1.K1.WH1	6	5
U1.K1.WH2	9	9
U1.K2.WH3	0	0
U2.K3.WH4	0	0


я хочу, чтобы скрыть строку АЛМ, когда нормальными или серьезными, 0, в данном примере я хочу, чтобы скрыть последние две строки.

я хочу получить такой результат

Alm	Normal	Urgent
U1.K1.WH1	6	5
U1.K1.WH2	9	9


Как я мог это сделать?

с уважением

Что я уже пробовал:

я попытался объединить селекты, имея, где, исключить...

3 Ответов

Рейтинг:
7

sujatha111

select * from 
(select 
a.Des as 'Alm', 
SUM (case k.IdE when 1 then 1 else 0 end) as Normal, 
SUM (case  k.IdE when 2 then 1 else 0 end) as Urgent  
FROM TblKBA a 
left join TblKBK k 
on a.idA = k.IdAr
group by a.Des )A
where (A.Normal>0 and A.Urgent>0)


Рейтинг:
28

MadMyche

Самый простой способ сделать это-обернуть то, что у вас есть, в Общее табличное выражение (CTE) а затем запросите CTE.
Чтобы встретиться с обычный или срочный равны 0 требование, предложение WHERE, которое я использовал, просто умножало столбцы, потому что все, что умножается на 0, равно 0.

; WITH cte (Alm, Normal, Urgent)
AS (
     SELECT     a.Des as 'Alm'
          ,     SUM (case k.IdE when 1 then 1 else 0 end) as Normal
          ,     SUM (case  k.IdE when 2 then 1 else 0 end) as Urgent
     FROM      TblKBA  a 
     LEFT JOIN TblKBK  k ON a.idA = k.IdAr
     GROUP BY  a.Des
)

SELECT *
FROM   cte
WHERE  ((Normal * Urgent) > 0)


Рейтинг:
13

Richard Deeming

Если вы хотите отфильтровать строки, где Normal и Urgent если оба они равны нулю, то вы можете сделать это до того, как сгруппируете их:

SELECT
    a.Des as 'Alm', 
    SUM(CASE k.IdE WHEN 1 THEN 1 ELSE 0 END) As Normal, 
    SUM(CASE k.IdE WHEN 2 THEN 1 ELSE 0 END) As Urgent  
FROM 
    TblKBA a 
    INNER JOIN TblKBK k 
    ON a.idA = k.IdAr
WHERE
    k.IdE In (1, 2)
GROUP BY
    a.Des
;

Если вы хотите отфильтровать строки, где либо Normal или Urgent равен нулю, то вы можете использовать HAVING пункт:
SELECT
    a.Des as 'Alm', 
    SUM(CASE k.IdE WHEN 1 THEN 1 ELSE 0 END) As Normal, 
    SUM(CASE k.IdE WHEN 2 THEN 1 ELSE 0 END) As Urgent  
FROM 
    TblKBA a 
    INNER JOIN TblKBK k 
    ON a.idA = k.IdAr
WHERE
    k.IdE In (1, 2)
GROUP BY
    a.Des
HAVING
    SUM(CASE k.IdE WHEN 1 THEN 1 ELSE 0 END) != 0
And
    SUM(CASE k.IdE WHEN 2 THEN 1 ELSE 0 END) != 0
;

Наличие (Transact-SQL) - SQL Server | Microsoft Docs[^]


jaket-cp

хороший 5ed