2013-07-10 45 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 
     ; 
相關問題