2016-07-05 14 views
0

SQL Server 2000の使用 - 古いデータベースがあり、正規化されていません。正規化されていない列によるグループ

それは、これらの列は、私が欲しいここ

123 
10 
20 
0 
40 
0 

123 
0 
20 
0 
40 
5 

数のサンプルが含まれている

memId 
c1 
c2 
c3 
c4 
c5 

のような列の束がこの

ようmemIdによってグループ化されたデータとカラム名を抽出することであり

は、

memId col total 
123 c1 10 
123 c2 40 
123 c4 80 
123 c5 5 

ここで数字はグループの合計です

私は毎回引き出してそれらを一緒にまとめることができましたが、より簡単な方法があるかどうか疑問に思っていました。

+0

ピボット.....を使用していますか? –

+0

SQL 2000のデータベースとアンピボットがサポートされていないようです –

+6

人はまだSQL2000を使用していますか?私のお悔やみ... – DavidG

答えて

1

あなたの好きなような感じですunpivotあなたの結果。データベースの1つのオプションは、union all次のようになります。

select memId, 'c1' as col, sum(c1) from yourtable group by memId, col 
union all 
select memId, 'c2' as col, sum(c2) from yourtable group by memId, col 
union all 
select memId, 'c3' as col, sum(c3) from yourtable group by memId, col 
union all 
select memId, 'c4' as col, sum(c4) from yourtable group by memId, col 
union all 
select memId, 'c5' as col, sum(c5) from yourtable group by memId, col 
+0

はい、これは私の質問で「私は毎回引き出して一緒に結合できると思った」 –

+0

@sgeddes実際には、GROUP BY –

-1

私がおっと、あなたのポイントを誤解しそうです。情報を別のテーブルに移行していますか?

しかし、最初に、用語の標準化

First Normal Form 
- Eliminate repeating groups in individual tables. 
- Create a separate table for each set of related data. 
- Identify each set of related data with a primary key. 

の私の使用に関する注意だから明確に、私は正規化について間違っていました。 良いこと まだ若いですか? :/

私はこれを再評価するのに(致命的な間違いはありませんか?)、またSQL Server 2000の制限があります。 redware - SQL SERVER Handbookで入手できるSQL Server 2000マニュアルの便利なコンパイルが見つかりました。

テーブル式については、表示されるのはsubqueriesviewsですが、本当のランキング機能はありません(ありがたいことに、Functionsを作成できます)。

の場合はに何らかの筆記体で値を追加するのはなぜですか?

  • あなたはまだピボットを解除するテーブルに少なくともN X #Columnsを解析しようとしています。複雑なピボットは存在しませんでした。
  • 高価な筆記体を使用する代わりに、SELECT 'C1'はシンプルで行に対して簡単に変更できます。
  • テーブルを連結したいので、最も簡単な方法はまだUNION ALLです。
  • 連結後にGROUP BYを1回実行することができます。シンプルでエレガント。

SOLUTION:

SELECT memID 
    , Col 
    , SUM(C1) AS Count 
FROM (
     SELECT 'C1' AS [Col], memID, C1 FROM #Test2 
     UNION ALL SELECT 'C2' AS [Col], memID, C2 FROM #Test2 
     UNION ALL SELECT 'C3' AS [Col], memID, C3 FROM #Test2 
     UNION ALL SELECT 'C4' AS [Col], memID, C4 FROM #Test2 
     UNION ALL SELECT 'C5' AS [Col], memID, C5 FROM #Test2) AS A 
GROUP BY memID, Col 
ORDER BY memID ASC, Col ASC 

ソース表:

CREATE TABLE #Test2 (memID INT, C1 INT, C2 INT, C3 INT, C4 INT, C5 INT) 
INSERT INTO #Test2 (memId, C1, C2, C3, C4, C5) 
VALUES (123, 10, 20, 0, 40, 0) 
    , (123, 0, 20, 0, 40, 5) 
    , (122, 5, 20, 10, 15, 0) 
    , (122, 5, 0, 0, 0, 60) 
    , (155, 10, 0, 0, 10, 10) 
    , (155, 0, 0, 0, 50, 50) 

結果:

memID Col Count 
122  C1 10 
122  C2 20 
122  C3 10 
122  C4 15 
122  C5 60 
123  C1 10 
123  C2 40 
123  C3 0 
123  C4 80 
123  C5 5 
155  C1 10 
155  C2 0 
155  C3 0 
155  C4 60 
155  C5 60 

私はあなたの最初の考えが正しいと思います。 乾杯。

+0

私は既にその形式のデータを持っていますが、私が提供した例のように各列が行になるようにする必要があります。 –

+0

@DaleFraserは私の更新された応答を見てください。フィードバック。確かに、悪い知識を主張したくない! –

関連する問題