2015-04-29 23 views
9

iki kez sayım için aynı tabloyu Üyelik ben her tür sayısını elde etme ve tek bir SQL sorgusu ile aşağıdaki gibi permütasyon yazmak için çalışıyorum 2 tablolarfarklı sütunlarda

A 
+----+-------+ 
| Id | User | 
+----+-------+ 
| 1 | user1 | 
| 2 | user2 | 
| 3 | user3 | 
+----+-------+ 

B 
+----+--------+------+ 
| Id | UserId | Type | 
+----+--------+------+ 
| 1 |  1 | A | 
| 2 |  1 | B | 
| 3 |  1 | C | 
| 4 |  2 | A | 
| 5 |  2 | B | 
| 6 |  2 | C | 
| 7 |  3 | A | 
| 8 |  3 | C | 
+----+--------+------+ 

UserId is FK from table A.Id 

var. Her bir permütasyon sayımı için

+---------+---------+---------+-----------+-----------+-----------+-------------+ 
| Count A | Count B | Count C | Count A^B | Count A^C | Count B^C | Count A^B^C | 
+---------+---------+---------+-----------+-----------+-----------+-------------+ 
|  3 |  2 |  3 |   2 |   3 |   2 |   2 | 
+---------+---------+---------+-----------+-----------+-----------+-------------+ 

ya da ayrı bir sorgu (örneğin sayısı A^B olduğu A ve B tipi vardır kullanıcıların sayısı anlamına gelmektedir).

A ve B türlerini ayrı ayrı almak için sorguyu denedim ve çalışmadı.

SELECT count(b1.type) AS count_a, count(b2.type) AS count_b FROM A 
JOIN B on A.id = B.user_id 
WHERE b1.type = 'A' or b2.type = 'B' 
GROUP BY A.id; 

+---------+---------+ 
| Count A | Count B | 
+---------+---------+ 
|  3 |  2 | 
+---------+---------+ 
+0

İki tablonun nereden geldiğinden emin değilim veya '^', –

+0

@ExplosionPills öğesinin yalnızca sütun takma adları olduğunu gösteriyor. –

+0

Ben soru güncellendi. Umarım daha iyi açıklayacaktır. Temel olarak, A^B sayısı, A ve B tipi –

cevap

7

Sen yazabilirsiniz:

select count(case when "Types" @> array['A'] then 1 end) as "COUNT A", 
     count(case when "Types" @> array['B'] then 1 end) as "COUNT B", 
     count(case when "Types" @> array['C'] then 1 end) as "COUNT C", 
     count(case when "Types" @> array['A','B'] then 1 end) as "COUNT A^B", 
     count(case when "Types" @> array['A','C'] then 1 end) as "COUNT A^C", 
     count(case when "Types" @> array['B','C'] then 1 end) as "COUNT B^C", 
     count(case when "Types" @> array['A','B','C'] then 1 end) as "COUNT A^B^C" 
    from (select array_agg("Type"::text) as "Types" 
      from "B" 
      group by "UserId" 
     ) t 
; 

fikri ilk biz bir dizi onun/onu türlerini içeren, her bir kullanıcı için, üreten bir alt sorgu kullanmak olmasıdır; Dış sorgu, daha sonra her bir tür kümeyi içeren dizileri sayar.

http://sqlfiddle.com/#!15/cbb45/1 adresinde eylemi görebilirsiniz. (Ben de alt sorgu değiştirilmiş bir sürümü var dahil ettik nasıl çalıştığını görmek yardımcı olmak için.)

Bazı alakalı PostreSQL belgeleri:

+0

olan kullanıcı sayısının çok iyi olduğu anlamına gelir. Burada COUNT() veya SUM() ister miyiz? –

+0

Bu sorgu tam ihtiyacım olanı yapar. Sağol millet! –

+0

@AmilOsmanli: Rica ederim! – ruakh

0

Belki de bu yanlış yorumluyorum, ancak seçtiğiniz ifadede oldukça basit bir durum açıklaması yapabileceğinizi düşünüyorum, ancak saymak yerine SUM:

SELECT SUM(CASE b.Types WHEN 'A' THEN 1 ELSE 0) as COUNT_A, 
     SUM(CASE b.Types WHEN 'B' THEN 1 ELSE 0) as COUNT_B 
FROM A 
JOIN B 
ON A.id = B.user_id 
WHERE b1.type = 'A' or b2.type = 'B' 
İlgili konular