Ben*_*Rox 4 ms-access concatenation
首先让我说枢轴解决方案是好的,但在这种情况下不能是最终解决方案,因为结果是几个空列(对于与特定记录不匹配的值),这不能在MS Access上使用2010年报道.
我相信这是一个常见的问题,一个好的解决方案可以帮助许多刚开始冒险进入VBA for Access的小型开发人员.
假设我在Ms Access中有一个表,其中包含以下信息:
| ProductID | AssignedColour |
|-----------|----------------|
| 1 | white |
| 1 | red |
| 1 | yellow |
| 2 | black |
| 2 | white |
| 3 | pink |
Run Code Online (Sandbox Code Playgroud)
问题是在表中有大约10,000种产品,它们使用大约250种独特的颜色名称(颜色列表可以增加).此外,一个特定的ProductID可能已为其分配了未定义数量的颜色.
我的问题是:如何在一行中显示所有指定的颜色,但是将颜色名称拆分为单独的列?
我想要的查询结果如下:
| ProductID | Colour1 | Colour2 | Colour3 | .... as many Columns as |
| | | | | assigned in above table. |
|-----------|---------|---------|---------|-------------------------------|
| 1 | white | red | yellow | |
| 2 | black | white | | |
| 3 | pink | | | |
Run Code Online (Sandbox Code Playgroud)
我需要生成MS Access 2010报告,并仅显示指定颜色的每个产品(不允许使用空列).
我找到了一些基于数据透视表的解决方案,但这会产生250个动态创建的列.所以我不知道如何只显示只有特定产品颜色匹配的特定列.
我的解决方案给出如下结果:
| ProductID | Colour1 | Colour2 | Colour3 | .... 250 columns with colors, |
| | | | | but it can't be on reports.|
|-----------|---------|---------|---------|---------------------------------|
| 1 | white | red | yellow | |
| 2 | white | <empty> | <empty> | |
| 3 | <empty> | <empty> | <empty> | |
Run Code Online (Sandbox Code Playgroud)
MS Access不允许显示动态列.生成此类报告也需要很长时间.它给出了空字段,这是专业报告中不可接受的.我正在考虑是否应该先将查询值放入某个临时表,然后连接值,但我不知道如何制作该表.也许某人有一个可以涵盖所有这些方面的示例数据库.
首先创建一个查询,按ProductID为每种颜色分配排名
SELECT
t1.ProductID,
t1.AssignedColour,
"Colour" & Format(COUNT(*),"000") AS ColourName
FROM
ProductColours AS t1
INNER JOIN
ProductColours AS t2
ON t1.ProductID = t2.ProductID
AND t1.AssignedColour >= t2.AssignedColour
GROUP BY
t1.ProductID,
t1.AssignedColour
Run Code Online (Sandbox Code Playgroud)
回国
ProductID AssignedColour ColourName
--------- -------------- ----------
1 red Colour001
1 white Colour002
1 yellow Colour003
2 black Colour001
2 white Colour002
3 pink Colour001
Run Code Online (Sandbox Code Playgroud)
现在将其包含在交叉表中查询到ColourName上的PIVOT
TRANSFORM First(AssignedColour) AS whatever
SELECT
ProductID
FROM
(
SELECT
t1.ProductID,
t1.AssignedColour,
"Colour" & Format(COUNT(*),"000") AS ColourName
FROM
ProductColours AS t1
INNER JOIN
ProductColours AS t2
ON t1.ProductID = t2.ProductID
AND t1.AssignedColour >= t2.AssignedColour
GROUP BY
t1.ProductID,
t1.AssignedColour
) AS ColourNames
GROUP BY ProductID
PIVOT ColourName
Run Code Online (Sandbox Code Playgroud)
返回
ProductID Colour001 Colour002 Colour003
--------- --------- --------- ---------
1 red white yellow
2 black white
3 pink
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1807 次 |
| 最近记录: |