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

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不允许显示动态列.生成此类报告也需要很长时间.它给出了空字段,这是专业报告中不可接受的.我正在考虑是否应该先将查询值放入某个临时表,然后连接值,但我不知道如何制作该表.也许某人有一个可以涵盖所有这些方面的示例数据库.

Gor*_*son 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
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)