【问题标题】:How to Select from a pivot table in ms access如何在 ms 访问中从数据透视表中进行选择
【发布时间】:2016-04-30 23:38:52
【问题描述】:

我有两张桌子:

我需要这样的东西:

HeaderID   |  Position1    |  IsSuccessful  |  Position2  |  IsSuccessful
-------------------------------------------------------------------------
    24719  |     gold_box  |        true    |  propname25 |        false
    24720  |       beyond  |        false   |        wtv  |        false
    24721  |      red_box  |        false   |      wtv22  |         true

到目前为止我已经做到了:

TRANSFORM Max(Proposals.PropName) AS MaxOfPropName
SELECT Headers.HeaderID
FROM Headers INNER JOIN Proposals ON Headers.ProposalID = Proposals.ProposalID
GROUP BY Headers.HeaderID
PIVOT Headers.Position;



HeaderID   |  Position1    |  Position2  |
------------------------------------------
    24719  |     gold_box  |  propname25 |
    24720  |       beyond  |        wtv  |
    24721  |      red_box  |      wtv22  |

现在我正在考虑从数据透视表中进行选择,但它不起作用,并且在网上找不到任何文档,例如:

select * from (
   TRANSFORM Max(Proposals.PropName) AS MaxOfPropName
   SELECT Headers.HeaderID
   FROM Headers INNER JOIN Proposals ON Headers.ProposalID = Proposals.ProposalID
   GROUP BY Headers.HeaderID
   PIVOT Headers.Position;
 )

有没有办法在另一个选择查询(ms 访问)中使用数据透视表的结果?如何? 稍后我将不得不使用带有 7 个表的单个查询,并将它们与另外 3 个数据透视表连接起来...... :) 对于这个问题,我很抱歉,但我被卡住了

谢谢

【问题讨论】:

    标签: sql ms-access pivot-table


    【解决方案1】:

    考虑将带有两个内连接的派生表子查询添加到每个职位的已保存交叉表查询。如果存在更多职位,请添加更多子查询。

    CrossTab 查询(另存为单独的查询以用于下面的主查询)

    TRANSFORM Max(Proposals.PropName) AS MaxOfPropName 
    SELECT Headers.HeaderID 
    FROM Headers 
    INNER JOIN Proposals ON Headers.ProposalID = Proposals.ProposalID 
    GROUP BY Headers.HeaderID 
    PIVOT Headers.Position
    

    主要查询

    SELECT crosstabQ.HeaderID, crosstabQ.Position1, pos1.IsSuccessful, 
           crosstabQ.Position2, pos2.IsSuccessful 
    FROM (crosstabQ    
    
    INNER JOIN    
       (SELECT IsSuccessful 
        FROM Headers
        WHERE Position = 1) AS pos1
    ON pos1.HeaderID = crosstabQ.HeaderID)
    
    INNER JOIN    
       (SELECT IsSuccessful
        FROM Headers
        WHERE Position = 2) AS pos2    
    ON crosstabQ.HeaderID = pos2.HeaderID
    

    或者,运行条件​​聚合,这是数据透视查询的通用版本(这里的布尔值将返回整数、0 或 -1):

    SELECT Headers.HeaderID, 
           Max(IIF(Headers.Position=1, Proposals.PropName, NULL)) As Position1,
           Max(IIF(Headers.Position=1, Headers.IsSuccessful, NULL)) As IsSuccessful1,
           Max(IIF(Headers.Position=2, Proposals.PropName, NULL)) As Position2,
           Max(IIF(Headers.Position=2, Headers.IsSuccessful, NULL)) As IsSuccessful2
    FROM Headers 
    INNER JOIN Proposals ON Headers.ProposalID = Proposals.ProposalID 
    GROUP BY Headers.HeaderID 
    

    【讨论】:

    • 谢谢你,但我的主要问题是我在 Ms-Access 中写作。而且他不喜欢告诉他“Select From (a pivot)”
    • 确实是 MS 访问限制。将枢轴另存为单独保存的查询并在 main 中引用它。
    • 是的 :) 这就是我昨天所做的,虽然我很失望,但至少 jet oledb 和 access 非常兼容,谢谢
    • Access' SQL 引擎是 Jet/ACE(Windows .dll 文件)。您是否看到我在其他数据上测试过的经过编辑的答案?你收到什么错误?为什么不使用替代答案?
    • 我昨天已经按照您的回答做了类似的事情,并且奏效了。我很失望我不得不在单独的查询中进行转换。但是因为我能够从 C# 中使用它们,所以我的所有问题都解决了。并且性能似乎不错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2020-01-27
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多