【发布时间】: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;
【问题讨论】:
-
首先,列应该是唯一的
-
抱歉,我帖子中的非唯一标题是疏忽。