【问题标题】:SQL - SELECT DISTINCT with field transpositionSQL - SELECT DISTINCT 与字段转置
【发布时间】:2011-12-14 19:31:21
【问题描述】:

我有一张这样的桌子:

    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             |

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

【问题讨论】:

  • 您编写并尝试过哪些 SQL 查询?

标签: sql ms-access concatenation distinct transpose


【解决方案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

【讨论】:

  • 谢谢。是的,我已经使用类似于您的例程在 Access 中创建了一个宏,以打印完整的 sql 字符串以(复制和粘贴)在查询中运行。
【解决方案2】:

我不确定您是否可以在 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;

【讨论】:

  • '@Mack - 谢谢!我不能在 Access 2007 中使用 UNPIVOT。但是使用 UNION SELECT 查询效果很好......问题是我必须手动编写整个查询结构并且我的表中的字段很多。我正在寻找一种自动提取字段名称并将每个字段的不同值出现在连接字符串中的方法。
  • 如果您愿意使用代码,这个stackoverflow thread 向您展示了如何从系统中获取字段名称。将此与上面的联合逻辑结合起来,将其作为代码中动态构建的查询link 执行,您应该有解决问题的方法。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2017-03-27
  • 2011-07-11
  • 2020-11-05
相关资源
最近更新 更多