1

我有一张这样的桌子:

    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             |

请问,有人可以帮我吗?提前致谢。
用于访问 2007 的 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 列包含单次出现而不是串联字符串。

4

2 回答 2

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
于 2011-10-25T15:48:19.183 回答
0

我不确定您是否可以在 access 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;
于 2011-10-25T10:26:57.263 回答