2017-09-27 21 views
1

ここではいくつかのSQL転置スレッドを見てきましたが、それらはすべてデータの再構築やデータサマリーを扱っています。私はそれらの状況のいずれにも合致しない、ある程度共通の状況を持っています。 これはMS Accessにあり、リンクテーブルを使用していることに注意してください(更新は許可されず、キーやIDはありません)。MS AccessのためのSQL行と列を転記するためのリンクテーブル

私はリンクテーブルを持っています。長い2行のデータしかありません。 それは、ユニークなビジネスユニット(BU)とそれに対応する年間売上のリストです。

linked_table 


    F1  F2  F3  F4 F5 ... 
    ----------------------------- 
row1 BU11 BU123 BU223 BU2 BU432... 
row2 $2345 $0  $50.50 $234 $567.22 

私はこのに何とか転置このデータセットが必要になります。

new_table or new_query 

BU  Sales 
--------------- 
BU11  $2345 
BU123 $0 
BU223 $50.50 
BU2  $234 
BU342 $567.22 
... 

ここでも、リンクAccessテーブル内のデータの2つだけの長い行があります。 私はこのことについて非常に退屈で醜い方法しか見つけられておらず、これを行うより良い方法があるのだろうかと思っていました。私は、私は両方のデータにダミー「共通鍵」が

そして
headers_qry 
    F1  F2  F3  F4 F5...  KEY 
    ---------------------------------------------- 
row1 BU11 BU123 BU223 BU2 BU432... UNIQUE123 

data_qry 
    F1  F2  F3  F4 F5...  KEY 
    ----------------------------------------------- 
row1 $2345 $0  $50.50 $234 $567.22... UNIQUE123 

を設定ハードきた2つの別々のクエリ

headers_qry 
    F1  F2  F3  F4 F5... 
    ------------------------------ 
row1 BU11 BU123 BU223 BU2 BU432... 

data_qry 
    F1  F2  F3  F4 F5... 
    ------------------------------ 
row1 $2345 $0  $50.50 $234 $567.22... 

にデータの2つの行を分離しました

STEP 1 その共通キーの2つのクエリの間に結合を追加し、何百ものUNIONステートメントで手動でヘッダーとデータのペアをペアにしました。うん!!

SELECT 
headers.F1 AS BU_Number, 
data.F1 AS BU_Sales 
FROM header_data_join_qry UNION ALL 
SELECT 
headers.F2 AS BU_Number, 
data.F2 AS BU_Sales 
FROM header_data_join_qry UNION ALL 
SELECT 
... 
headers.F100 AS BU_Number, 
data.F100 AS BU_Sales 
FROM header_data_join_qry UNION ALL; 

は、MS Accessのは、これらの複数のUNION ALLクエリを処理することはできませんし、私は100の周りに到達したら、それは、SQL文には複雑すぎるエラーを与え始め、退屈で醜いこれだけではなく。

リンク元テーブルとMS ACCESS SQL環境の制限を考慮して、これをよりうまく処理する方法はありますか?本当にありがとう!

+0

を適合させることができますか?私はUNIONでSELECTラインの制限が50であると思いました。私が知っている唯一の選択肢は、VBAが一時テーブルにレコードを書き込むことです - テーブルは永久的です、データは一時的です。 – June7

+0

3番目の回答を見てください[ここ](https:// stackoverflow。com/questions/7255423/how-to-simulate-unpivot-in-access-2010)を参照してください。おそらくそれはあなたを助けるでしょう – cha

+0

私は基本的に2つのサブクエリに分離して100になった。その後、私はUNIONも同様に2人にしました。これにより、ACCESS許容値が合計50を超えて上がります。 –

答えて

1

次のことを試すことができます。

2行のデータを区切った開始位置から、共通キーは必要ありません(両方とも1行なので)。

SELECT DLookUp("F" & Number, "headers_qry") AS BU, DLookUp("F" & Number, "data_qry") As Sales 
FROM (
SELECT DISTINCT Abs(Ones.ID Mod 10) + Abs(Tens.ID Mod 10) * 10 + Abs(Hundreds.ID Mod 10)*100 As Number 
FROM MSysObjects As Ones, MSysObjects As Tens, MSysObjects As Hundreds 
) As NumbersQuery 
WHERE Number BETWEEN 1 And 200 

本質的に、このクエリは2つの部分を有する:

  1. 0と999(Gustavから適応技術)
  2. から指定された列番号を返す外部クエリとの間のすべての数を返すサブクエリ両方のクエリを実行し、サブクエリをフィルタリングします。 (9999から0)
  3. BETWEEN 1 And 200が高い数字が必要な場合は、あなたのサンプル

    にフィットするように適合させることができる

サブクエリも、あなたが100に立ち上がっ

+0

これはfyreです。ありがとう! –

+0

@CamCallこれがあなたの質問に答えた場合は、回答を受け入れたものとしてマークしてください。どのように動作するのか、どのような利点があるかについては、[ここ](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)をお読みください。 –

+0

レコードを返す前に、応答していない状態で10分間実行したと言わなければなりません。 –

関連する問題