2016-12-16 1 views
0

SQL照会を作成すると、以下のサマリー結果が得られます。2週単位のカラムからのSQLサマリー

表プレビュー:

UniqueID  StartWk  FinishWk 
ID000001  2016|49  2016|49 
ID000002  2016|49  2016|50 
ID000003  2016|49  NULL 
ID000004  2016|49  2016|50 
ID000005  2016|49  2016|50 
ID000006  2016|50  NULL 
ID000007  2016|50  NULL 
ID000008  2016|50  2016|50 
ID000009  2016|50  2016|51 

概要出力:

Week   Started  Finished 
2016|49  5   1 
2016|50  4   4 
2016|51  0   1 
+7

はいそれが可能です。 – xQbert

+0

何を試しましたか? –

+0

はい、可能です。同じ年+週にcount(startWk)とcount(FinishWk)を使用します。 GROUP BY句を使用した後 – Mattasse

答えて

1

これは、1つのアプローチであるが、私はそれが最も効率的だとは思いません。

最初に、データの中に仕上げの週があるか、またはその逆になることがあるので、すべての週のセットが必要です。

次に、クエリを使用して週ごとの値の数を選択するだけです。

SELECT A.week 
    , (SELECT count(1) FROM table B WHERE B.StartWk = A.Week) as Started 
    , (SELECT count(1) FROM table C WHERE C.FinishWk= A.Week) as Finished 

FROM (SELECT startWk as Week FROM Table WHERE startWk is not null UNION 
     SELECT FinishWk as Week FROM Table WHERE FinishWk is not null 
    ) A 

ではなく組み合わせ週間で毎週2つのクエリを実行するので週ごとに一度カウントを取得することができますので、これはおそらく、より効率的です。あなたのDBMSは、ANSI準拠している場合

SELECT A.Week, B.Started, C.Finished 
FROM (SELECT startWk as Week FROM Table WHERE startWk is not null UNION 
     SELECT FinishWk as Week FROM Table WHERE FinishWk is not null) A 
LEFT JOIN (SELECT startWk, count(1) Started 
      FROM TABLE 
      GROUP BY StartWk) B 
    ON A.Week = B.startWk 
LEFT JOIN (SELECT FinishWk, count(1) Finished 
      FROM TABLE 
      GROUP BY FinishWk) C 
    ON A.Week = C.FinishWk 
+0

私はそれを変更するでしょう:SELECT A.Week、ISNULL(B.Started、0)、ISNULL(C.Finished、0)それはNULLのridsを取得します。 追加する場所:WHERE Week IS NOT NULL その他のクエリは素晴らしいです。 – MadOX

+1

私は 'where week is not null 'にもう一度テストする必要があると思います... – xQbert

+0

MSSQLにはありません私はあなたのクエリをテストしていました:)それはカウントするカラムにNULLを無視します。カウントするものがない場合はnullを保持します。 – MadOX

1

、以下のあなたのために働く必要があります。

select 
    coalesce(a.week, b.week) week, 
    coalesce(a.cnt, 0) started, 
    coalesce(b.cnt, 0) finished 
from 
    (select startwk week, count(1) cnt from t where startwk is not null group by startwk) a 
full outer join 
(select finishwk week, count(1) cnt from t where finishwk is not null group by finishwk) b 
on a.week = b.week 
order by week; 
+0

不要です。 DBMSはANSIに準拠している必要があり、完全な外部結合をサポートしていない場合は、mySQLであってはなりません。 :P – xQbert

+0

Na、私は初めて間違っていた:P – xQbert

0

私は以下のようなクエリを更新していますxQbertクエリを使用します。

SELECT 
    A.`Week`, 
    COALESCE(B.Started,0)Started, 
    COALESCE(C.Finished,0)Finished 
FROM (SELECT StartWk as `Week` FROM my_table_name UNION 
     SELECT FinishWk as `Week` FROM my_table_name) A 
LEFT JOIN (SELECT startWk, count(1) Started 
      FROM my_table_name 
      GROUP BY StartWk) B 
    ON A.`Week` = B.StartWk 
LEFT JOIN (SELECT FinishWk, count(1) Finished 
      FROM my_table_name 
      GROUP BY FinishWk) C 
    ON A.`Week` = C.FinishWk 
WHERE TRIM(A.`Week`) != '' 
ORDER BY A.`Week`; 

SQL Fiddle Demo

出力:

enter image description here

関連する問題