3

これは基本的にデータベース結合に関する質問ですが、列名から列名へのマッピング コンポーネントを使用する必要があり、困惑しています。

複数の調査テーブルがあります。簡単にするために、2010 年のもの (「d2010」と呼ばれる) と 2011 年のもの (「d2011」と呼ばれる) の 2 つがあるとします。行は調査に対応し、列 ('c1'、'c2'、'c3'、... 'cN' という名前であると想定できます) は質問への回答に対応します。したがって、「d2010」は次のようになります

         id  c1  c2  c3  .. cX
survey 1
survey 2
survey 3
...
survey N

「d2011」は次のようになります

         id  c1  c2  c3  .. cY
survey 1
survey 2
survey 3
...
survey N

主な目的は、特定の質問に対する回答が 2010 年から 2011 年にかけてどのように変化したかを示すことです。具体的には、私の目標は、特定の回答について、2 年間で調査がどのように異なるかを示す新しいテーブル (3 つの列を持つ) を作成する SQL コマンドを作成することです。

         id  2010-response  2011-response
survey 1
survey 2
survey 3
...
survey N

列名が一貫していた場合、必要なのは次のような単純なものでした。

select d2011.id, d2010.c1 as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id;

残念ながら、テーブルの作成者は列名の一貫性を保っていませんでした。例えば、

c1 of 2010 corresponds to c2 of 2011
c2 of 2010 corresponds to c1 of 2011
c3 of 2010 corresponds to c3 of 2011
c4 of 2010 corresponds to c7 of 2011
...

だから私がやろうとしてきたのは、次のようなものを入力することです

select d2010.id, d2010.c1 as 'last year', d2011.f(c1) 'this year' from d2010 join d2011 on d2010.id=d2011.id;

ここで、「d2011.f(c1)」は、2010 年の列名を 2011 年の列名にマップする関数の使用を示します。マッピングは、数式で表現できるほど単純ではないため、何らかの結果をもたらすテーブルが必要であると想定します。お気に入り

2010  2011
  c1    c2
  c2    c1
  c3    c3
  c4    c7

必要な結合操作を SQL で表現する方法はありますか? つまり、マップテーブルで、以下を標準SQL(一般)とSQLite(特に)に変換する方法はありますか?

select d2011.id, f(d2010.c1) as 'last year', d2011.c1 'this year' from d2010 join d2011 on d2010.id=d2011.id;.id;

よろしくお願いします!

4

2 に答える 2

0

基本的に探しているのは、列名をテーブルに格納し、それらの列名を将来のクエリで使用する方法です。残念ながら、動的SQLを使用する必要があると思います。例:

declare @SQL nvarchar(1024)
set @SQL = 'select * from Table'
exec sp_executeSQL @SQL

したがって、マッピングテーブルを使用すると、「マップされた」列名を返し、結合を宣言することができます。

    declare @SQL nvarchar(1024)
    declare @mappedColumnName nvarchar(1024)

    select @mappedColumnName = 2011 from mappedTable where 2010 = 'c1'

    set @SQL = 'select *
    from d2010 join d2011 on d2010.id=' + @SQL + ';.id';

    exec sp_executeSQL @SQL

利用可能な場合に最近使用したもう1つの方法は、.NETのEntityFrameworkです。これにより、リフレクションを使用して、LINQクエリ内の列名を動的に選択できます。

これらの方法はどちらも私には「汚い」と感じますが、それはこれらのテーブルを設計した人を反映しています。代わりに、比較のためにそれらをExcelにエクスポートするのが最善かもしれません。

于 2012-05-23T17:27:50.880 に答える
0

あなたの質問は完全には明確ではないようです。。。次のように参加できます。

select d2011.id, d2010.c2 as 'last year', d2011.c1 'this year'
from d2010 join d2011 on d2010.id = d2011.id

標準SQLでは列を動的に指定する方法はありません。動的SQLはこの機能を提供します。

2つのテーブル列リストをExcelに取り込み、それらを2つの列に並べて配置し、Excel関数を使用してSQLステートメントを作成することで、最も簡単に実行できると思います。

于 2012-05-23T17:29:48.780 に答える