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
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Donovan, Şarkılarından 1'ini The Beatles'ın "Lucy in the Sky with Diamonds" şarkısıyla karşılaştırdı
Charly Reynolds Yakın Zamandaki Vokal Kord Ameliyatını Açıkladı: 'Şarkı Söylemekte Sorun Yaşıyordum'
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'