2013-07-10 40 views
-4

表ABCD如何获得零数据时不存在特定字段

 Group1 Class 
     C1 A 
     C2 A 
     C3 B 
     C4 C 
     C1 A 

这里我有表,即时通讯试图获得如下因素 结果

OUTPUT:(使用这种格式要求表ABCD

 
Group1 Class Count 
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查询。谢谢你在前进,即时通讯相当新的查询WRT甲骨文所以请帮助我的查询。

+0

什么样的SQL这是MS我?? – AlvinArulselvan

+0

你已经试过了什么SQL? –

+0

请让我知道投票前的原因请即时发布疑问 – user2568275

回答

0

您可以使用下面的查询来获取结果。这创建了每个group1和每个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; 

SQL Fiddle with Demo

0

此作品在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] 

DEMO

编辑

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] 

UPDATED DEMO

+0

首先感谢代码片段,但我想这只适用于计数为0或1的情况。如果计数增加,请退出我 – user2568275

+0

@ user2568275检查更新的答案 – bvr

0

不知道我理解正确你的问题,但我想你想要的东西喜欢这样的:

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

0
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 
     ; 
相关问题