2011-10-25 11 views
1

とDISTINCT SELECT:SQL - 私はこのような表持つフィールド移調

cod_amb | param | value    | 

    21  | field_a | N.A., Conif   | 
    21  | field_b | Fixed, Temp   | 
    21  | field_c | N.A.    | 
    21  | field_d | N.A., >5 years  | 
    21  | field_e | Natural, Artificial | 
    24  | field_a | N.A., NR   | 
    24  | field_b | Fixed, Temp   | 
    24  | field_c | N.A.    | 
    24  | field_d | N.A., <5 years  | 
    24  | field_e | Natural    | 

は、誰が私を助けることができるしてください:私はこのような結果のテーブルを取得する必要があります

cod_amb | field_a | field_b | field_c | field_d | field_e 

    21  | N.A. | Fixed | N.A. | N.A. | Natural 
    21  | Conif | Temp | N.A. | >5 years| Artificial 
    21  | N.A. | Fixed | N.A. | N.A. | Natural 
    24  | N.A. | Fixed | N.A. | N.A. | Natural 
    24  | NR  | Fixed | N.A. | <5 years| Natural 
    24  | N.A. | Temp | N.A. | N.A. | Natural 
    21  | N.A. | Fixed | N.A. | N.A. | Natural 

を?前もって感謝します。アクセス2007

@@@@@@@@@@@@@@@@@@@@@@
UPDATE

ため
SQLは、私はAccessでこのルーチンを書いた:

Sub printSQL() 
Dim db As Database 
Set db = CurrentDb() 
Dim tab As String 
tab = "tab_011" 
Dim rs1 As dao.Recordset 
Set rs1 = db.OpenRecordset(tab) 
Dim sqlAll As String 
Dim str() As String 
Dim i As Integer 
i = 0 
ReDim str(i) 
Dim fld As dao.Field 
For Each fld In rs1.Fields 
    If fld.Name = "Area" Then 
    ElseIf fld.Name = "lungh" Then 
    ElseIf fld.Name = "id_elem" Then 
    ElseIf fld.Name = "id_tass" Then 
    ElseIf fld.Name = "x_coord" Then 
    ElseIf fld.Name = "y_coord" Then 
    Else 
     str(i) = "SELECT cod_amb, '" & fld.Name & "' AS Param, " & fld.Name & " AS Val " 
     i = i + 1 
     ReDim Preserve str(i) 
    End If 
Next 
Set fld = Nothing 
i = 0 
For i = 0 To UBound(str) - 1 
    If i = 0 Then 
     sqlAll = str(i) & "FROM " & tab & " UNION " 
    ElseIf i > 0 And i < UBound(str) - 1 Then 
     sqlAll = sqlAll & str(i) & "FROM " & tab & " UNION " 
    ElseIf i = UBound(str) - 1 Then 
     sqlAll = sqlAll & str(i) & "FROM " & tab & ";" 
    End If 
Next 
Debug.Print sqlAll 
End Sub 

ルーチンの出力は、このような文字列である:私は実行最後に

SELECT tab_011.cod_amb, "type_veg" AS Param, type_veg AS Val 
FROM tab_011 
UNION 
SELECT tab_011.cod_amb, "type_acq" AS Param, type_acq AS Val 
FROM tab_011 
UNION 
SELECT tab_011.cod_amb, "status" AS Param, status AS Val 
FROM tab_011 
UNION 
SELECT tab_011.cod_amb, "num_pnt" AS Param, num_pnt AS Val 
FROM tab_011 
UNION 
SELECT tab_011.cod_amb, "terr" AS Param, terr AS Val 
FROM tab_011; 

この文字列をAccessでユニオンクエリとして使用し、結果の表をExcelでエクスポートします。
結果の表は、上記の出力とわずかに異なります。違いは、列Valに連結された文字列ではなく単一のオカレンスが含まれていることです。

+0

何SQLクエリは、あなたの書かれたと試してみましたか? –

答えて

1

あなたはこのような何かがあなたのために動作しますが、コードを使用することができた場合:

Dim rs As DAO.Recordset 
Dim db As Database 
Dim sql As String 
Set db = CurrentDb() 

Set rs = db.OpenRecordset("tblTable") 

sql = "" 
Dim fld As DAO.Field 
For Each fld In rs.Fields 
    If fld.Name <> "cod_amb" Then sql = sql + "SELECT cod_amb, '" + fld.Name + "' AS fldName, " + fld.Name + " AS fldValue FROM tblTable UNION " 
Next 
Set fld = Nothing 

sql = Left(sql, Len(sql) - 6) 

MsgBox (sql) 

Form_tblTable.RecordSource = sql 

rs.Close 
Set rs = Nothing 
+0

ありがとうございます。はい、私はすでにあなたのようなルーチンを使用してAccessでマクロを作成し、クエリで実行する(コピー&ペースト)に完全なSQL文字列を印刷しました。 – albus2011

0

UNIONクエリを使用することができない場合は、アクセス2007でPIVOT/UNPIVOTを使用できるかどうかはわかりません... DECLAREテーブルと挿入は、単体テストをスタンドアロンにするためだけにあります。テーブル。

DECLARE @table TABLE (
    cod_amb int, 
    field_a varchar(10), 
    field_b varchar(10), 
    field_c varchar(10), 
    field_d varchar(10), 
    field_e varchar(10)) 

INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural') 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'Conif','Temp','N.A.','>5 years','Artificial'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'N.A.','Fixed','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'NR','Fixed','N.A.','<5 years','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'N.A.','Temp','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural') 

SELECT cod_amb, 'field_a' Field, field_a value FROM @table 
UNION 
SELECT cod_amb, 'field_b' Field, field_b value FROM @table 
UNION 
SELECT cod_amb, 'field_c' Field, field_c value FROM @table 
UNION 
SELECT cod_amb, 'field_d' Field, field_d value FROM @table 
UNION 
SELECT cod_amb, 'field_e' Field, field_e value FROM @table 

あなたが利用できる(またはここに着陸他のSQLサーバーの読者のための)SQL Serverを持っている場合は、UNPIVOTを使用することになり...再び、DECLAREテーブルと挿入は、例えば、作業スタンドアロンを作成するだけであり、あなたは独自のテーブルを使用します。

DECLARE @table TABLE (
cod_amb int, 
field_a varchar(10), 
field_b varchar(10), 
field_c varchar(10), 
field_d varchar(10), 
field_e varchar(10)) 

INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural') 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'Conif','Temp','N.A.','>5 years','Artificial'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'N.A.','Fixed','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'NR','Fixed','N.A.','<5 years','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (24,'N.A.','Temp','N.A.','N.A.','Natural'); 
INSERT INTO @table(cod_amb,field_a,field_b,field_c,field_d,field_e) 
VALUES (21,'N.A.','Fixed','N.A.','N.A.','Natural') 


SELECT cod_amb, Field, Value 
FROM 
    (SELECT cod_amb,field_a,field_b,field_c,field_d,field_e FROM @table 
    ) SourceTable 
UNPIVOT 
    (Value FOR Field IN 
     (field_a,field_b,field_c,field_d,field_e) 
)AS unpvt; 
+0

'@Mack - ありがとう!私はAccess 2007でUNPIVOTを使用することはできません。しかし、UNION SELECTを使用すると、クエリはうまくいきます。問題は、私が手作業でクエリ構造体を作成し、テーブルのフィールドがたくさんあることです。私は、フィールドの名前を自動的に抽出し、連結された文字列内の各フィールドに固有の値の出現を入れるメソッドを探していました。 – albus2011

+0

コードを使用したい場合は、この[stackoverflow thread](http://stackoverflow.com/questions/3343922/ms-access-2010-get-column-names)では、フィールド名をシステム。これを上記の結合論理と組み合わせて、動的に構築されたクエリとして実行してください。[リンク](http://stackoverflow.com/questions/133922/how-do-you-execute-a-dynamic-sql-query-against-ms -access-2003-via-vba)をコードから削除すると、問題の解決策が得られるはずです。 – Mack

関連する問題