【问题标题】:Access Report Confusion访问报告混乱
【发布时间】:2020-04-25 06:08:04
【问题描述】:

我有一个返回以下字段的查询:

  • AccountNum
  • AccountDescription
  • AccountGroupID
  • AccountGroupDescription
  • StoreName

我需要这样的报告

  • 这些行是由AccountGroupDescription 分组的AccountNum-AccountDescriptions,由AccountGroupID 排序
  • 列是StoreNames

它将用于比较每个商店针对给定 AccountGroup 使用的帐户 - 所有商店都使用帐户组来标准化报告。

以下 Access 交叉表查询接近我想要实现的目标,但不确定如何列出每个帐户组的每个商店下的帐号,而不是计算它们。

谢谢!

TRANSFORM Count(qryAccountNbrsByStore.[Account#]) AS [CountOfAccount#]
SELECT qryAccountNbrsByStore.[CFS LineItem]
FROM qryAccountNbrsByStore
GROUP BY qryAccountNbrsByStore.[CFS LineItem]
PIVOT qryAccountNbrsByStore.StoreName;

编辑 4/22 下午 2:00
查询结果数据示例

StoreName AccountNumber AccountGroup  
StoreName1 H237 1-AccountsPayable  
StoreName1 H240 1-AccountsPayable  
StoreName1 H345 2-AccountsReceivable  
StoreName1 H348 2-AccountsReceivable  
StoreName1 H351 2-AccountsReceivable  
StoreName1 H357 2-AccountsReceivable  
StoreName1 H445 3-AccruedExpenses  
StoreName1 H460 3-AccruedExpensese  
StoreName2 F340 1-AccountsPayable  
StoreName2 F349 1-AccountsPayable  
StoreName2 F456 2-AccountsReceivable  
StoreName2 F459 2-AccountsReceivable  
StoreName2 F461 2-AccountsReceivable  
StoreName2 F564 3-AccruedExpenses  
StoreName3 C123 1-AccountsPayable  
StoreName3 C235 2-AccountsReceivable  
StoreName3 C238 2-AccountsReceivable  
StoreName3 C333 3-AccruedExpenses  

所需的报告输出:

每个 AccountGrouping 下的 accountNumbers 旨在显示在 StoreNames 下。

  1. 应付账款

    StoreName1 StoreName2 StoreName3
          H237       F340       C123  
          H240       F349  
    
  2. 应收账款

    StoreName1 StoreName2 StoreName3
          H345       F456       C235  
          H348       F459       C238  
          H351       F461  
          H357  
    
  3. 应计费用

    StoreName1 StoreName2 StoreName3
          H445       F564       C333  
          H460  
    

【问题讨论】:

  • 样本数据和所需结果的示例将大有帮助。

标签: sql ms-access


【解决方案1】:

考虑使用相关聚合子查询创建运行计数查询,这是一种复杂的 SQL 方法,它运行相关函数或聚合(MINMAXAVGSUMCOUNT)本身。在这里使用,它会生成一个用于运行组计数的新列:

SELECT q.[AccountGroup], q.[AccountNumber], q.[StoreName],
          (SELECT COUNT(*)
           FROM qryAccountNbrsByStore sub
           WHERE sub.[AccountNumber] <= q.[AccountNumber]
             AND sub.[AccountGroup] = q.[AccountGroup]
             AND sub.[StoreName] = q.[StoreName]) AS num

FROM qryAccountNbrsByStore q

或者,使用DCount 域函数,

SELECT q.[AccountGroup], q.[AccountNumber], q.[StoreName],
          DCount("*", "qryAccountNbrsByStore", 
                 "[AccountNumber] <= '" & q.[AccountNumber] & "'
                  AND [AccountGroup] = '" & q.[AccountGroup] & "'
                  AND [StoreName] = '" & q.[StoreName] & "'") AS num

FROM qryAccountNbrsByStore q

然后,在这个新的上述查询(或临时表,如果性能是一个问题)上重新运行交叉表,并将聚合调整为 MINMAX,因为它们使用字符串值:

TRANSFORM MAX(n.[AccountNumber]) AS [MaxOfAccountNumber]
SELECT n.[AccountGroup], n.[num]
FROM myNewQuery n
GROUP BY n.[AccountGroup], n.[num]
PIVOT n.[StoreName];

此外,如果您将上述查询集成到 Access 报告中,请务必指定 PIVOT 列,您可以进一步调整排序甚至省略您不想显示的商店。

PIVOT q.StoreName IN ([StoreName1], [StoreName2], [StoreName3])


PIVOT q.StoreName IN ([StoreName3], [StoreName2], [StoreName1])


PIVOT q.StoreName IN ([StoreName1], [StoreName3])

【讨论】:

  • 对于类型不匹配,此查询假定所有字段都是字符串:q.[AccountNumber]q.[AccountGroup]q.[StoreName],如帖子所示。至于第二个,请确保您正确拼写商店名称(任何空格或特殊字符使用[...] - 无引号)。您不应该编列,而是编造实际的商店名称。
  • 我们可以删除上面的旧 cmets 吗?另外,请在基础数据中显示商店名称的 sn-p,然后显示您对 PIVOT IN 的尝试。最好用文字而不是图片来发布错误。
  • 因为您的 AcctNumber 中有撇号,请将双引号替换为单引号,反之亦然(或者返回并正确使用 PIVOT IN 并使用相关子查询)。更重要的是,尝试使用临时表:SELECT Col1, Col2, Col3, ... INTO myTempTable FROM myQueryWithSub。然后根据 myTempTable 生成基础报告。如果重新运行,请在运行报告之前使用 DELETE/INSERT...SELECT 语句。
  • 所以我之前的 Pivot In 尝试是:PIVOT n.StoreName IN ([Area Chevrolet], [Group Honda], [Area Ford]);将括号 [] 更改为引号 "" 就可以了——现在有了一个有效的报告。理想情况下,我宁愿不必将我的 StoreNames “硬编码”到查询中,因为我希望能够在不编辑我的查询的情况下添加新的商店。所以我将 ' 换成了 " 并且该解决方案现在也可以正常工作 - 并且不需要硬编码。再次感谢这里提供的所有帮助。我将在不久的将来对 SQL 进行一些阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
相关资源
最近更新 更多