Mam tabelę z 2 kolumnami jak poniżej:

Col 1    | col_stats
Field 1  |   open
Field 2  |   close
Field 1  |   close
Field 1  |   open

Chcę być jak:

Col1    | cnt_open | Cnt_close
Field 1 |  2          | 1             
Field 2 |  0          | 1             

** Napisałem zapytanie **

select col 1, count(case when col_stats= 'open' then 1 else 0 END) cnt_open,
count (case when col_stats= 'close' then 1 else 0  END ) cnt_close 
from `project.dataset.tablename`
group by col1

Wynik Wyjście z powyższego zapytania jest nieprawidłowe:

Col1    | cnt_open | Cnt_close  
Field 1 |  2          | 2             
Field 2 |  1          | 1  

Czy ktoś może dać mi znać, dlaczego wyjście daje nieprawidłowy wynik dla liczby nawet po wprowadzeniu warunku.

0
Neha0908 1 marzec 2019, 20:25

2 odpowiedzi

Najlepsza odpowiedź

Użyj countif():

select col1, countif(col_stat = 'open') as num_opens, countif(col_stat = 'closed') as num_closes
from t
group by col1;

W SQL count() Liczy liczbę wartości nie - NULL. Twój kod będzie działał z sum(). Ale countif() jest prostszy i wyraźniejszy.

3
Gordon Linoff 1 marzec 2019, 17:26

Użyj null zamiast 0:

select col1, count(case when col_stats= 'open' then 1 else null END) cnt_open,
count (case when col_stats= 'close' then 1 else null  END ) cnt_close 
from `project.dataset.tablename`
group by col1
1
rad 1 marzec 2019, 17:37