在一行和多列中显示多个行值,并避免Access报告中的空字段

时间:2014-06-06 07:25:50

标签: ms-access concatenation

首先让我说枢轴解决方案是好的,但在这种情况下不能是最终解决方案,因为结果是几个空列(对于与特定记录不匹配的值),这不能使用在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不允许动态列的显示。生成此类报告也需要很长时间。它给出了空字段,这是专业报告中不可接受的。我正在考虑是否应该先将查询值放入某个临时表,然后连接值,但我不知道如何制作该表。 也许某人有一个样本数据库可以涵盖所有这些方面。

2 个答案:

答案 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