首先让我说枢轴解决方案是好的,但在这种情况下不能是最终解决方案,因为结果是几个空列(对于与特定记录不匹配的值),这不能使用在MS Access 2010报告中。
我认为这是一个常见的问题,一个好的解决方案可以帮助许多刚开始冒险进入VBA for Access的小型开发人员。
假设我在Ms Ms中有表,其中包含以下信息:
| ProductID | AssignedColour |
|-----------|----------------|
| 1 | white |
| 1 | red |
| 1 | yellow |
| 2 | black |
| 2 | white |
| 3 | pink |
问题是表中有大约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 | | | |
我需要生成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> | |
MS Access不允许动态列的显示。生成此类报告也需要很长时间。它给出了空字段,这是专业报告中不可接受的。我正在考虑是否应该先将查询值放入某个临时表,然后连接值,但我不知道如何制作该表。 也许某人有一个样本数据库可以涵盖所有这些方面。
答案 0 :(得分:5)
首先创建一个查询,按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
返回
ProductID AssignedColour ColourName
--------- -------------- ----------
1 red Colour001
1 white Colour002
1 yellow Colour003
2 black Colour001
2 white Colour002
3 pink Colour001
现在将它包装在交叉表中查询到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
返回
ProductID Colour001 Colour002 Colour003
--------- --------- --------- ---------
1 red white yellow
2 black white
3 pink
答案 1 :(得分:0)
试试这个
SELECT t.Filed1,
STUFF(ISNULL((SELECT ', ' + x.Filed2
FROM TableName x
WHERE x.Filed1= t.Filed1
GROUP BY x.Filed2
FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '')
FROM TableName t
GROUP BY t.Filed1