2011-10-25 16 views
1

我有這樣的一個表:SQL - SELECT DISTINCT與現場換位

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 

我一定要得到一個結果表是這樣的:

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    | 

請,任何人可以幫助我嗎?提前致謝。
SQL對於Access 2007

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

我在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

我不確定如果您可以在2007年的訪問中使用PIVOT/UNPIVOT,如果不是,您可以使用UNION查詢... 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 Server的讀者誰在這裏降落)的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線程](http://stackoverflow.com/questions/3343922/ms-access-2010-get-column-names)告訴你如何獲得字段名稱的系統。結合上面的聯合邏輯並將其作爲一個動態構建的查詢來執行[link](http://stackoverflow.com/questions/133922/how-do-you-execute-a-dynamic-sql-query-against-ms -access-2003-via-vba),你應該有解決你的問題的方法。 – Mack