【问题标题】:How to expand a table into multiple columns with a query如何使用查询将表扩展为多列
【发布时间】:2013-06-07 13:04:21
【问题描述】:

为了回答我的问题,我将简化我的数据结构。我有三个表,样本、分析、值。 Sample 有一个 Pk 自动编号字段、SampleID 和一个 DateCreated 字段。 Analysis 有一个 PK 自动编号字段 AnalysisID 和一个 AnalysisName 字段。 Values 有三个字段,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 结果需要是什么样子。谢谢!

【问题讨论】:

    标签: sql vba ms-access


    【解决方案1】:

    这里有一个 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 部分,然后单击设计按钮以查看它是如何完成的。

    【讨论】:

    • 我喜欢这个方法,又快又简单!但是,我不确定如何修改它以仅显示某些内容。就像,如果我只想要 Temp 和 Density,我将如何阻止 Mass 出现?使用 WHERE 子句表示 WHERE AnalysisID = 1 OR AnalysisID = 2?而且,我可以指定一个顺序,而不是按字母顺序吗?人们习惯于以某种顺序看待它们,而改变它可能很难适应。非常感谢,我以前从来没有真正弄乱过 PIVOT 表,我可以看到它们非常方便。
    • 没错,将 WHERE 条件添加到子查询中。
    • 谢谢!关于基于 AnalysisID 而不是 AnalysisName 组织字段的任何帮助?它们按字母顺序从左到右显示,而不是按数字显示。我想要第 3 列中的温度,第 4 列的密度和第 5 列的质量。
    • 按分析 ID 排序时会发生什么?在 GROUP BY 之后,在 PIVOT 之前,就在这里吐痰。
    • 这是一个有趣的问题,所以我花了一些时间寻找答案。看起来唯一的方法是在 PIVOT 语句的末尾添加 in("Temp","Density","Mass",...) 。我只需使用 VBA 即时查询以包含此信息。
    【解决方案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 函数,但如果您只有少数分析类型,那么这是一种简单的方法。

    【讨论】:

    • 非常感谢您的建议。我目前有 53 种分析类型,值表中有 125,000 行。我从来没有使用过这样的设置,但是尝试一下......它似乎可能适用于这么多行吗?我估计我们每年将有超过 300,000 行的值。
    • 好吧,做 53 条 MAX/CASE 语句可能很麻烦,但它会工作得很好。
    • 所以 'CASE WHEN' 是 T-SQL,Access 不支持它,但是我已经让 SWITCH 中途工作了。我可以获取这些值,但它们没有按 SampleID 分组,如果我包含它,我必须包含所有“SWITCH”元素作为聚合的一部分。我不知道如何做到这一点并保持数据完整性。
    • 听起来像 PIVOT 可能是 Access 的方式。
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多