要回答我的问题,我将简化数据结构。我有三个表,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结果需要的样子。谢谢!
答案 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类型,那么这是一种简单的方法。