【问题标题】:Crosstab Query in Access and/or SQL to accomplish table combinationAccess和/或SQL中的交叉表查询完成表组合
【发布时间】:2015-04-10 18:02:30
【问题描述】:

我有一个调查(多标准决策分析),它将结果转储到名为 CriteriaWeighting 的下表中:

User | Criteria1 | Criteria2 | ... | CriterX
--------------------------------------------
Name1|   n1w1    |    n1w2   | ... |   n1wX |
Name2|   n2w1    |    n2w2   | ... |   n2wX |
...

我想创建一个名为 WeightinStats 的新表,其结构如下:

Criteria  |  Average  |  StDev  |  Var  |
-----------------------------------------
Criteria1 |  AVG(c1)  | StD(c1) | Var(c1)
Criteria2 |  AVG(c2)  | StD(c2) | Var(c2)
Criteria3 |  AVG(c3)  | StD(c3) | Var(c3)
...       |  ...      | ...     | ...
CriteriaX |  AVG(cX)  | StD(cX) | Var(cX)

其中 AVG(c1)、StD(c1)、Var(c1) 等是上述所有各种标准加权响应(n1w1、n1we、n1wX 等)的平均值、标准偏差和方差

我曾尝试实现交叉表查询,但它永远不会正确,所以我想知道是否有办法通过 SQL 强制创建所需的表。我正在使用 MSAccess 2010。

感谢您的帮助。

【问题讨论】:

    标签: ms-access ms-access-2010 crosstab


    【解决方案1】:

    不幸的是,交叉表反其道而行之。如果您从所需的结构 (WeightsinStats) 开始并需要您的原始结构 (CriteriaWeighting),交叉表查询可以实现它。当然是在转换端进行聚合。

    原因是,crosstab queries 以这样一种方式转换记录集,即一列中的值项成为单独的单独列,并聚合相应的数字:Sum()、Avg()、Count()...

    但是,向后退,您可能需要执行 UNION 查询。请注意:根据复杂性,联合的数量有 Access SQL 限制。

    SELECT 'Criteria1'  As Criteria, Avg([Criteria1]), StDev([Criteria1]), Var([Criteria1])
    FROM CriteriaWeighting
    UNION 
    SELECT 'Criteria2' As Criteria, Avg([Criteria2]), StDev([Criteria2]), Var([Criteria2])
    FROM CriteriaWeighting
    ...
    

    如果您有多个条件,您可以使用 VBA 动态构建联合查询:

    Dim db As Database
    Dim strSQL As String
    Dim qdef As QueryDef
    Dim i As Integer, AllCriteriaCount As Integer
    
    AllCriteriaCount = ??  'ENTIRE FULL COUNT OF CRITERIA HERE
    
    Set db = Currentdb
    
    ' BUILD SQL STRING
    For i = 1 To AllCriteriaCount
    
      If i = 1 Then
        strSQL = "SELECT 'Criteria1'  As Criteria, Avg([Criteria1]), StDev([Criteria1]), Var([Criteria1])" & _
                 " FROM CriteriaWeighting"
      Else
        strSQL = strSQL & "UNION" & _
                 " SELECT 'Criteria" & i & "' As Criteria, Avg([Criteria" & i & "]), StDev([Criteria" & i & "]), Var([Criteria" & i & "])" & _
                 " FROM CriteriaWeighting"
      End If
    Next i
    
    ' CREATE QUERY DEF (STORED QUERY)
    Set qdef = db.CreateQueryDef("WeightinStatsquery", strSQL)
    
    ' MAKE-TABLE TO OUTPUT FINAL
    db.Execute "SELECT * WeightinStatsquery INTO WeightinStats"
    
    Set qdef = Nothing
    Set db = Nothing
    

    【讨论】:

    • 太棒了。谢谢你的帮助。我可能只需要修改数据库的一些元素。
    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2023-03-11
    • 2010-11-11
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多