表 ABCD
Group1 类 C1 A C2 A C3乙 C4 C C1 A
在这里我有桌子,我试图得到以下结果
OUTPUT : (在这种格式中需要使用表 ABCD
Group1 类计数 C1 A 2 C1 B 0 C1 C 0 C2 A 1 C2 B 0 C2 C 0 C3 A 0 C3 B 0 C3 C 1
我想使用 sql 中的查询来实现这一点。提前谢谢你,我对oracle的查询很陌生,所以请帮助我查询。
这适用于sql server
SELECT O.*
,CASE WHEN I.[Group1] IS NULL THEN 0 ELSE 1 END AS Cnt
FROM Table1 I RIGHT JOIN
(
SELECT DISTINCT T1.[Group1],T2.[Class] FROM Table1 T1
CROSS JOIN Table1 T2
) O ON I.[Group1] = O.[Group1] AND I.[Class] = O.[Class]
编辑
SELECT O.*
,SUM(CASE WHEN I.[Group1] IS NULL THEN 0 ELSE 1 END) AS Cnt
FROM Table1 I RIGHT JOIN
(
SELECT DISTINCT T1.[Group1],T2.[Class] FROM Table1 T1
CROSS JOIN Table1 T2
) O ON I.[Group1] = O.[Group1] AND I.[Class] = O.[Class]
GROUP BY O.[Group1],O.[Class]
不确定我是否正确理解了你的问题,但我认为你想要这样的东西:
with all_combinations as (
select distinct g.group1, c.class
from (
select group1
from foobar
) g
cross join (
select class
from foobar
) c
)
select ac.group1, ac.class, count(f.group1)
from all_combinations ac
left join foobar f on f.group1 = ac.group1 and f.class = ac.class
group by ac.group1, ac.class
order by ac.group1, ac.class
SQLFiddle 演示:http ://sqlfiddle.com/#!4/9be9f/1
您可以使用以下查询来获取结果。这将创建一个列表 eachgroup1
和 each class
。获得该列表后,您可以计算原始表中有多少匹配项:
select s.group1,
s.class,
count(d.class) tot
from
(
select distinct a.group1, c.class
from abcd a
cross join
(
select distinct class
from abcd
) c
) s
left join abcd d
on s.group1 = d.group1
and s.class = d.class
group by s.group1, s.class
order by s.group1, s.class;
WITH grp AS (
SELECT DISTINCT grp AS grp FROM abcd
)
, cls AS (
SELECT DISTINCT cls AS cls FROM abcd
)
SELECT g.grp, c.cls
, COALESCE(a.cnt, 0) AS the_count
FROM grp g
FULL OUTER JOIN cls c ON 1=1
LEFT JOIN (
SELECT DISTINCT grp, cls, COUNT(*) as cnt
FROM abcd
GROUP BY grp,cls
) a ON a.grp = g.grp AND a.cls = c.cls
ORDER BY g.grp ,c.cls
;