bir SQL sorgusunda iki COUNT birleştir

Aug 29 2020

New_customers X customer_cancellations göstermek için bir sorgu yapmam gerekiyor

bu sorgu ile new_customers'ı aylara göre alabilirim:

count (başlangıç_tarihi), to_char (başlangıç_tarihi, 'MM') monthNumber olarak, to_char (başlangıç_tarihi, 'YY') yearNumber olarak seçin 
başlangıç_tarihinin boş olmadığı müşteriden 
to_char (başlangıç_tarihi, 'MM'), to_char (başlangıç_tarihi, 'YY') göre gruplandır 
yearNumber, monthNumber ile sıralama;

bununla birlikte, müşterilerin iptallerini aylara göre alabilirim:

count (cancellation_date), to_char (cancellation_date, 'MM') monthNumber olarak, to_char (cancellation_date, 'YY') yearNumber olarak seçin
cancellation_date değerinin boş olmadığı müşteriden 
to_char (cancellation_date, 'MM'), to_char (cancellation_date, 'YY') göre gruplandır 
yearNumber, monthNumber ile sıralama;

her iki sorgu da şunun gibi bir şey döndürür:

sayım | monthnumber | yearnumber
1 | 1 | 20
7 | 2 | 20
5 | 3 | 20

ama bunun gibi bir şey isterim:

customer_out_count | customer_in_count | monthnumber | yearnumber
 0 | 1 | 1 | 20
 0 | 7 | 2 | 20
 1 | 0 | 3 | 20
 0 | 1 | 4 | 20
 5 | 7 | 5 | 20
 1 | 5 | 6 | 20

Bu diğer sorguyu zaten denedim:

tür olarak "başlangıç" ı seçin, sayı olarak say (başlangıç_tarihi), ay_sayısı olarak to_char (başlangıç_tarihi, "MM"), yılNumarası olarak to_char (başlangıç_tarihi, "YY")
başlangıç_tarihinin boş olmadığı müşteriden
to_char (başlangıç_tarihi, 'MM'), to_char (başlangıç_tarihi, 'YY') göre gruplandır
Birlik
tür olarak 'iptal', counta olarak say (cancellation_date), monthNumber olarak to_char (cancellation_date, 'MM'), yearNumber olarak to_char (cancellation_date, 'YY') seçin
cancellation_date değerinin boş olmadığı müşteriden
to_char (cancellation_date, 'MM'), to_char (cancellation_date, 'YY') göre gruplandır
yearNumber, monthNumber ile sıralama;

Sonuç "tamam" oldu:

yazın | newcount | monthnumber | yearnumber
 başlangıç ​​| 1 | 1 | 20
 iptal | 1 | 1 | 20
 iptal | 7 | 2 | 20
 başlangıç ​​| 3 | 3 | 20
 iptal | 1 | 4 | 20
 başlangıç ​​| 7 | 5 | 20
 başlangıç ​​| 5 | 6 | 20

Ancak ihtiyacım olanı elde etmek için kod üzerinde bazı işlemler yapmam gerekecek.

Bu iki sorguyu bir arada nasıl birleştirebilirim? Postgreslq kullanıyorum.

Yanıtlar

1 GMB Aug 29 2020 at 06:30

Bir seçenek satırları ayırır, ardından toplar. Postgres'te bunu yanal birleştirme ile ifade edersiniz:

select
    sum(x.customer_in_count)  as customer_in_count,
    sum(x.customer_out_count) as customer_out_count
    to_char(x.dt, 'MM') as monthNumber, 
    to_char(x.dt, 'YY') as yearNumber
from customer c
cross join lateral (values
    (c.start_date, 1, 0), (c.cancellation_date, 0, 1)
) as x(dt, customer_in_count, customer_out_count)
where x.dt is not null
group by monthNumber, yearNumber
order by monthNumber, yearNumber