2017-01-18 1 views
1

テーブルを作成するにはどうすればいいですか?SQLで列を知らないでテーブルを作成

アイデアは私が3列あるテーブルデータということです:私は必要なものIDNAME、およびVALUE

NAMEの値に応じて複数の値を取得する方法である - 私が行うことができませんそれは単純なWHEREまたはJOINです(これは他の値が必要です - 私の質問では他のNAMEの値が必要です)。

NAMEのすべての異なる値を列に変換するために、このテーブルが構築される方法のためにPIVOTにしたいので、それ以降の検索で取得するのが簡単になります。

私が今したいことは、私は別のクエリの結果を結合するために後でそれを使用することができますので、何とか一時テーブル/変数にこれを保存することです...

ですから、例えば:

列:今

CREATE TABLE MainTab 
(
    id int, 
    nameMain varchar(max), 
    notes varchar(max) 
); 

CREATE TABLE SecondTab 
(
    id int, 
    id_mainTab, int, 
    nameSecond varchar(max), 
    notes varchar(max) 
); 

CREATE TABLE DATA 
(
    id int, 
    id_second int, 
    name varchar(max), 
    value varchar(max) 
); 

テーブルデータからいくつかの例のデータ:今すぐ

| id | id_second_int |  name  |  value  | 
|-------------------------------------------------------| 
| 1 |  5550  | number  | 111115550  | 
| 2 |  6154  | address | 1, First Avenue | 
| 3 |  1784  | supervisor | John Smith | 
| 4 |  3467  | function | Marketing | 
| 5 |  9999  | start_date | 01/01/2000 | 
:::: 

「名前」にはたくさんの異なる値があり、「名前」の値によって多くの異なる値を取得する必要があることを想像してください... その理由は、数字、住所、スーパーバイザ、関数、開始日、...列になる。 これは、可能な列の量のために私は動的に行います - それらはすべてINステートメントにすべて書き込むのに時間がかかります。新しい文字列を入力するたびに手動で追加することを忘れたくはありません。私が実行した結果(@query)をtempTab /変数に格納したいと思っていることが分かっています。私は後でmainTabと結合するために使用したいと思っています... @cols(DATA.nameの値を保持しています)を使用できればいいですが、これを行う方法を理解できないようです。

追加: 動的ではない方法を使用すると( 'IN'の後にすべての値を手動で書き留めます)、statusという列を作成する必要があります。今のところ、この列には(これまでのところ、値はピボットされていないテーブルには存在しないため、どこにでもNULLがあります)、日付に応じて「オープン」または「クローズ」したいとします(私はstart_dateとend_dateを持っています)

CASE end_date 
WHEN end_date < GETDATE() THEN pivotTab.status = 'closed' 
ELSE pivotTab.status = 'open' 

はどこでこの文を置くことができるのは、私のメインのクエリは次のようになりましょう:

SELECT * FROM(
(SELECT id_second, name, value, id FROM TABLE_DATA) src 
PIVOT (max(value) FOR name IN id, number, address, supervisor, function, start_date, end_date, status) AS pivotTab 
JOIN SecondTab ON SecondTab.id = pivotTab.id_second 
JOIN MainTab ON MainTab.id = SecondTab.id_mainTab 

WHERE pivotTab.status = 'closed'; 

答えて

0

まあ、私の知る限り理解できるよう - あなたには、いくつかのselect文を持っているだけでその結果を「ダンプ」する必要がありますか?この場合、select intoのような構文を使用することができます:

select ..... 
into #temp_table 
from .... 

これにより、select文の列に従ってテンポラリテーブルが作成され、選択されたdatatementから返されたデータが格納されます。

参照のためMDSNを参照してください。

+0

しかし、テーブルとしてtemp_tableを宣言してから、別の列を知りたいのですが、どれだけ多くの列が保持されるかはわかりません。そのため、Dynamic SQL(ただし、私はこの分野の全面的なノブであり、それを使用する方法はまだ学習しています) この時点で自分のタスクを完了するのに必要なのは、作成したピボットタブ内のいくつかの列をテーブルの他の値に応じて 'status'カラムのデータ) – LisekKL

+0

@LisekKL *" temp_tableをテーブルとして宣言しなければなりません... "* - いいえ、あなたはしません。 'select into'が自動的に作成され、select文で返されたデータが入力されます。それともあなたの本当の必要から何かを逃したのですか? –

+0

ok申し訳ありませんが、これは私にとってはうまくいかなかったのは、データベースへの読み取り専用アクセスがあるため、テーブル、関数、またはプロシージャを作成できないからです... どうやって私のニーズに応じてピボットテーブルにデータを入力できるように、CASEステートメントを使用します(どこに置くか)。 – LisekKL

関連する問題