2011-02-08 7 views
1

私たちは、数字を報告しようとしている小さなランダムな調査をしています。複数のテーブルにまたがる2つのグループを別々にカウントするSQL?

+--------+-------+----------------------+-----------------+ 
| caseID | patID | randomizedDate  | randomizedGroup | 
+--------+-------+----------------------+-----------------+ 
| 1  | 5000 | 2/17/2010 5:12:00 PM | T    | 
| 2  | 5005 | 3/11/2010 1:45:00 PM | C    | 
| 3  | 5007 | 3/22/2010 7:16:00 AM | C    | 
| 4  | 5011 | 4/10/2010 3:34:00 PM | T    | 
| 5  | 5015 | 4/19/2010 5:41:00 PM | C    | 
| 6  | 5018 | 5/23/2010 4:06:00 PM | T    | 
| 7  | 5021 | 6/27/2010 5:28:00 PM | T    | 
| 8  | NULL | NULL     | C    | 
| 9  | NULL | NULL     | T    | 
| 10 | NULL | NULL     | T    | 
| 11 | NULL | NULL     | C    | 
| 12 | NULL | NULL     | C    | 

テーブルが既に統計を使用して無作為Tsを&のCsで予め生成された:このデータベースでは、我々はそうように設計されている各テーブルごとに異なるランダム化群(対照対処置)を含む8つのテーブルを持っていますプログラムを事前に。したがって、我々はプロジェクトのためにあらかじめ定められた基準に基づいて満たされるのを待っている8つのグループを持っています。これらのテーブルの複数にPatIDは存在しません。

私たちが必要とするのは、randomizedGroup列に基づいてこれらのテーブル全体でカウントの内訳です。たとえば:

+--------------------+--------+--------+--------+----------+ 
| randomizationGroup | Table1 | Table2 | Table3 | So on... | 
+--------------------+--------+--------+--------+----------+ 
| C     | 10  | 24  | 14 |   | 
| T     | 11  | 16  | 21 |   | 
+--------------------+--------+--------+--------+----------+ 

今のところ、私は次のクエリを使用して、これらの番号を取得していますが、私はこれが最適であるか、私はそれを別の方法をやっているかどうかどうかを確認したかったです。 SQLを使うほど、私はそれが好きなので、私はいつも自分のスキルを洗練して学びたいと思っています。

SELECT randomizationGroup, SUM(count1) AS Table1, SUM(count2) AS Table2, SUM(count3) AS Table3, SUM(count4) AS Table4, SUM(count5) AS Table5, SUM(count6) AS Table6, SUM(count7) AS Table7, SUM(count8) AS Table8 
FROM (
    SELECT randomizationGroup, COUNT(*) AS count1, 0 AS count2, 0 AS count3, 0 AS count4, 0 AS count5, 0 AS count6, 0 AS count7, 0 AS count8 FROM Table1 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, COUNT(*) AS count2, 0 AS count3, 0 AS count4, 0 AS count5, 0 AS count6, 0 AS count7, 0 AS count8 FROM Table2 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, COUNT(*) AS count3, 0 AS count4, 0 AS count5, 0 AS count6, 0 AS count7, 0 AS count8 FROM Table3 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, 0 AS count3, COUNT(*) AS count4, 0 AS count5, 0 AS count6, 0 AS count7, 0 AS count8 FROM Table4 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, 0 AS count3, 0 AS count4, COUNT(*) AS count5, 0 AS count6, 0 AS count7, 0 AS count8 FROM Table5 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, 0 AS count3, 0 AS count4, 0 AS count5, COUNT(*) AS count6, 0 AS count7, 0 AS count8 FROM Table6 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, 0 AS count3, 0 AS count4, 0 AS count5, 0 AS count6, COUNT(*) AS count7, 0 AS count8 FROM Table7 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
    UNION ALL 
    SELECT randomizationGroup, 0 AS count1, 0 AS count2, 0 AS count3, 0 AS count4, 0 AS count5, 0 AS count6, 0 AS count7, COUNT(*) AS count8 FROM Table8 WHERE patid IS NOT NULL GROUP BY randomizationGroup) all_groups 
GROUP BY randGroup 

ありがとうございます!

+0

使用しているデータベースエンジンとバージョンは何ですか? – Lamak

+0

SQL 2005標準SP3 9.00.4053。00 – Richard

+0

すべてのデータを1つのテーブルにコピーできますか?テスト名を示す追加の列がありますか? – Mark

答えて

0

以下のクエリは、単一のテーブルからあなたに無作為化グループごとに異なるカウントを与える必要がありますが、私はそれはあなたが望むものではないと思いますが、多分それはあなたが持っているもの

SELECT randomizationGroup, COUNT(case 
    when randomizedGroup='C' then 1 end) 
    AS countforC, Count(case when 
    randomizedGroup='T' then 1 end) AS 
    countforT from Table1 group by 
    randomizationGroup 
+0

他の7つのテーブルはどうですか? –

+0

まあまあ..しかし、私は彼がすべてのエントリを持つデータを持つことができればと思っていた..彼はすべてのカウントを得るためにこれを書くことができます..しかし、私は彼の問題のために働いていない知っている.. – Vishal

0

は、基本的には同じくらい良いですhelps-それが取得します。これは主に、いくつかのテーブルで同じ種類のデータを持っていることが原因です。あるタイプのフィールドを持つ同じテーブルにそれらを持っていれば、より良い形になります。

まあ本当に、あなたはあなたが建てPIVOTを持っているDBを使用している場合を除きsum on a case statementsで終わるデータをピボットする必要があると思いませんので。もちろん

あなたは本当にあなたに望んでいた場合は可能性あなたがそれを必要としていると分かった場合、これは8つのテーブルのUNIONを行うビューを作成しますが、これはちょっと過度に設計されているようです。

1

私はすべてのテーブルのビューを作成します。将来、データを統合する場合は、単一のテーブルの構造になる可能性があります。

CREATE VIEW AllTables as 
SELECT randomizationGroup, 'Table1' Source, COUNT(*) C FROM Table1 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table2', COUNT(*) C FROM Table2 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table3', COUNT(*) C FROM Table3 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table4', COUNT(*) C FROM Table4 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table5', COUNT(*) C FROM Table5 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table6', COUNT(*) C FROM Table6 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table7', COUNT(*) C FROM Table7 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
UNION ALL 
SELECT randomizationGroup, 'Table8', COUNT(*) C FROM Table8 WHERE patid IS NOT NULL GROUP BY randomizationGroup 
GO 

はその後、私はそれが高速で言うことはありませんSQL Server 2005の

SELECT randomizationGroup, Table1,Table2,Table3,Table4,Table5,Table6,Table7,Table8 
FROM AllTables P 
pivot (sum(C) for Source in (Table1,Table2,Table3,Table4,Table5,Table6,Table7,Table8)) V 

でPIVOT演算子を使用しますが、それは確かにあなたが持っているものに代わるものです。

0

良い古いジョイントはトリックすべきです。あなたが見ることができるように、グループ識別子がハードコーディングする必要がある、ので

SELECT 
    randomizationGroup = g.Grp, 
    Table1 = t1.Cnt, 
    Table2 = t2.Cnt, 
    Table3 = t3.Cnt, 
    Table4 = t4.Cnt, 
    Table5 = t5.Cnt, 
    Table6 = t6.Cnt, 
    Table7 = t7.Cnt, 
    Table8 = t8.Cnt 
FROM (SELECT 'C' AS Grp UNION ALL SELECT 'T') g 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table1 
    GROUP BY randomizationGroup) t1 ON g.Grp = t1.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table2 
    GROUP BY randomizationGroup) t2 ON g.Grp = t2.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table3 
    GROUP BY randomizationGroup) t3 ON g.Grp = t3.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table4 
    GROUP BY randomizationGroup) t4 ON g.Grp = t4.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table5 
    GROUP BY randomizationGroup) t5 ON g.Grp = t5.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table6 
    GROUP BY randomizationGroup) t6 ON g.Grp = t6.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table7 
    GROUP BY randomizationGroup) t7 ON g.Grp = t7.randomizationGroup 
    INNER JOIN (
    SELECT randomizationGroup, Cnt = COUNT(*) 
    FROM Table8 
    GROUP BY randomizationGroup) t8 ON g.Grp = t8.randomizationGroup 

このソリューションは、例えば、あなた、またはPIVOTを使用して1、のように普遍的ではありません。しかし、それがあなたのためにうまくいくなら、素晴らしい。しかし、ハードコードされた副選択を、すべての表から明白なrandomizationGroupを取り出すものに置き換えることによって、それを助けることができます。

関連する問題