【问题标题】:Selection that repeats a group of columns based on a separate column having a different value基于具有不同值的单独列重复一组列的选择
【发布时间】:2021-12-14 02:11:19
【问题描述】:

您好,感谢您的观看!

我正在尝试从先前的查询中做出复杂的选择,但我很难找到解决方案,部分原因是我很难描述我所追求的或要搜索的内容。问题来了:

我有什么([table1]):

identifier month item 1 item 2
xyz-1 10 0 0
xyz-2 10 0 0
xyz-1 11 1 1
xyz-2 11 1 1

如果可能的话,我想要什么:

identifier item 1 - 10 item 2 - 10 item 1 - 11 item 2 - 11
xyz-1 0 0 1 1
xyz-2 0 0 1 1

目标是我在一年中的每个月都有一组项目(上例仅显示 10 月和 11 月)。我觉得 Group By and Join 解决方案是我所需要的,但是我花了一整天的时间在这上面。

感谢任何帮助!

更新 1 - 关闭解决方案:

结合下面两位贡献者的建议,我能够重写生成上面起始表的原始查询。

我一直在运行这个查询:

TRANSFORM First([Points]) AS ItemPoints
SELECT identifier, month
FROM [source]
GROUP identifier, month
PIVOT name;

但这创建了一个月的专栏,事后看来非常明显。

解决方案是以下查询:

TRANSFORM First([source].Points) AS ItemPoints
SELECT [source].identifier
FROM [itemNames], [source]
GROUP BY [source].identifier
ORDER BY ScoreMonth & [itemNames].ItemId
PIVOT ScoreMonth & [itemNames].ItemId;

其中 [itemNames] 是返回唯一项目名称列表的查询,即“项目 1”、“项目 2”位。

这产生了下表:

identifier 10item 1 10item 2 11item 1 11item 2
xyz-1 0 0 1 1
xyz-2 0 0 1 1

我可以使用 :)

更新 2 - 未解决

在我发布找到解决方案后不久,我意识到由于 Transform 行上的聚合函数,值不正确。我正在再次研究这个问题,下面使用 DlookUp() 函数给出了解决方案。

更新 3 - 解决方案

我发现我的 Transform 查询的问题在于 ORDER BY 和 PIVOT 行需要引用 [source] 表而不是 [itemNames] 表。我还将 First() 函数更改为 Min(),但都可以工作:)

TRANSFORM Min([source].Points) AS ItemPoints
SELECT [source].identifier
FROM [source]
GROUP BY [source].identifier
ORDER BY ScoreMonth & '_' & [source].ItemId
PIVOT ScoreMonth & '_' & [source].ItemId;

【问题讨论】:

标签: sql ms-access


【解决方案1】:

您正在尝试执行的操作称为交叉表查询。但是,您的查询有 2 个列标题 Month 和 Item。月是看不见的。 Access 和 Excel 仅允许在交叉表查询中使用 1 个列标题。所以我的解决方案是手动生成 2 列交叉表。 因此,对于手动交叉表,我们需要执行交叉连接查询来生成我们需要的所有行和列。然后我们使用计算字段和 dlookup 函数将 Table1 中的正确值插入到即将到来的交叉表查询的根查询中的正确单元格中。 ItemNames 是所有项目名称的表,Months(这里是 2 个月),Identifiers 是所有标识符。由于我们不能有 2 个具有相同名称的列,因此我们将使用 ItemMonth 作为解决方法。

Value: Nz(DLookUp("item1","Table1","identifier = '" & [identifier] & "'   AND monthnumber = " & [MonthNumber]),0)

ItemMonth: [MonthNumber] & [ItemName]

'Table 1

ID  identifier  monthnumber item1   item2
3   xyz-1   10  0   0
4   xyz-2   10  0   0
5   xyz-1   11  1   1
6   xyz-2   11  1   1

'after cross join : query1 in picture

MonthNumber ItemName    identifier  Value   ItemMonth
10  Item 1  xyz-1   0   10Item 1
11  Item 1  xyz-1   1   11Item 1
10  Item 2  xyz-1   0   10Item 2
11  Item 2  xyz-1   1   11Item 2
10  Item 1  xyz-2   0   10Item 1
11  Item 1  xyz-2   1   11Item 1
10  Item 2  xyz-2   0   10Item 2
11  Item 2  xyz-2   1   11Item 2

交叉表设置非常简单。交叉表是总计查询的一种,所以要注意汇总函数:

'result of our cross-tab query but the column names are still wrong so we will fix that with a report

identifier  10Item 1    10Item 2    11Item 1    11Item 2
xyz-1   0   0   1   1
xyz-2   0   0   1   1

为了生成报告,我刚刚选择了交叉表查询并点击报告。然后进入设计模式并编辑所有列标签。如果您必须经常执行此整个过程或有很多项目,请使用 VBA 自动调整报表标签。

除此之外 1. 在 Access 中,如果交叉表查询基于稍微复杂的查询,它们就会出错。如果您的交叉表基于查询并且它不起作用,请尝试将交叉表的查询转换为带有生成表查询的表。然后将交叉表基于新表。

除此之外 2. 我建议将交叉表视为查看数据的唯一方式。每次向此数据添加或减去一项时,都会在交叉表中添加或减去 12 列。这意味着每次项目更改时,您都必须根据交叉表调整任何报告和表单。工作量很大。

【讨论】:

  • 感谢您的时间和精力,好先生!我今天会研究这个,让你知道我的结果!
  • 好的,我想我明白你在这里列出的内容,我现在将尝试实施。此查询是我在 VBA 中构建的动态报告系统的一部分,因此列标题的重命名和添加/删除内容应该没有问题,但仍然感谢您的指出。
  • 好的,您确实帮了很多忙,但是一旦我开始尝试您建议的解决方案,我发现 DLookUp 参数“item1”让我感到困惑。不过,在处理这个问题时,我了解了有关 CrossTab 查询的更多信息,因此能够重写在我的帖子中生成表的查询(我将其称为“先前查询”):)
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2022-07-18
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多