如何使用查询将表扩展为多个列

时间:2013-06-07 00:45:42

标签: sql vba ms-access

要回答我的问题,我将简化数据结构。我有三个表,Sample,Analysis,Values。 Sample有一个Pk自动编号字段,SampleID和一个DateCreated字段。 Analysis具有PK自动编号字段AnalysisID和AnalysisName字段。值有三个字段,SampleID,AnalysisID,Value。数据的通用布局如下。

样品

 SampleID     DateCreated
 1            6/1/2013
 2            6/2/2013
 3            6/3/2013
 4            6/3/2013

分析

AnalysisID    AnalysisName
1             Temp
2             Density
3             Mass

SampleID    AnalysisID    Value
1           1             65
1           2             1.1
2           1             68
2           2             1.0
2           3             57
3           2             1.2
4           2             0.9
4           3             54

现在,我希望有人能够动态设计查询......我想我可以解决这个问题,如果我能弄清楚如何将这些数据转换成以下格式。例如,如果用户想要所有样本和分析,则查询需要生成这样的表...

SampleID  DateCreated  Temp  Denisty  Mass
1         6/1/2013     65    1.1 
2         6/2/2013     68    1.0      57
3         6/3/2013           1.2
4         6/3/2013           0.9      54

获得此结果的查询结果如何?我可以弄清楚如何使用VBA动态创建它,只要我能理解最终SQL结果需要的样子。谢谢!

2 个答案:

答案 0 :(得分:3)

这是一个PIVOT表查询,它将为您完成 表1-3按您列出的顺序排列。我还将Value重命名为Value1,因为它是一个保留字。

TRANSFORM First(Table3.Value1) AS FirstOfValue1
SELECT Table1.SampleID, Table1.DateCreated
FROM Table2 INNER JOIN (Table1 INNER JOIN Table3 ON Table1.SampleID = Table3.SampleID) ON Table2.AnalysisID = Table3.AnalysisID
GROUP BY Table1.SampleID, Table1.DateCreated
PIVOT Table2.AnalysisName;

将其粘贴到查询构建器的SQL部分,然后单击设计按钮以查看它是如何完成的。

答案 1 :(得分:2)

不确定特定于Access的答案,但您可以使用CASE语句,简化而不需要所有联接,例如:

SELECT SampleID, DateCreated
       ,MAX(CASE WHEN AnalysisID = 1 THEN Value ELSE '' END) as Temp
       ,MAX(CASE WHEN AnalysisID = 2 THEN Value ELSE '' END) as Density
       ,MAX(CASE WHEN AnalysisID = 3 THEN Value ELSE '' END) as Mass
FROM Tables/Joins, Etc.
GROUP BY SampleID, DateCreated

您也可以查看PIVOT函数,但如果您只有少数几种Analysis类型,那么这是一种简单的方法。