SQL - ВЫБЕРИТЕ DISTINCT с транспонированием поля - PullRequest
1 голос
/ 25 октября 2011

У меня есть такая таблица:

    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

@@@@@@@@@@@@@@@@@@@@@@
ОБНОВЛЕНИЕ

Я написал эту подпрограмму в 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 содержит единственное вхождение, а не объединенную строку.

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Если вы можете использовать код, что-то вроде этого будет работать для вас:

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 голосов
/ 25 октября 2011

Я не уверен, что вы можете использовать PIVOT / UNPIVOT в Access 2007, если вы не можете использовать запрос 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;
...