Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如果许多列的字段为空,则向左移动值_Vba_Ms Access - Fatal编程技术网

Vba 如果许多列的字段为空,则向左移动值

Vba 如果许多列的字段为空,则向左移动值,vba,ms-access,Vba,Ms Access,我有如下所示的数据,代表从1到10列出的最便宜的供应商及其特定物品的价格(每行1件/件) 编辑:我已经使用以下步骤将数据缩减到我想要查看的供应商。现在我想将所有数据移到左边,这样我只有6列带有供应商名称/价格的数据(而不是现在的20列) 多个Iif语句(Iif(1_firma=“Computersalg”或1_firma=“Proshop”或1_firma=“Compumail”;1_firma;”“)位于列标题中,因此现在我只有三家供应商及其价格的数据 当前表列和字段(继续10个供应商和价格,

我有如下所示的数据,代表从1到10列出的最便宜的供应商及其特定物品的价格(每行1件/件)

编辑:我已经使用以下步骤将数据缩减到我想要查看的供应商。现在我想将所有数据移到左边,这样我只有6列带有供应商名称/价格的数据(而不是现在的20列)

多个Iif语句
(Iif(1_firma=“Computersalg”或1_firma=“Proshop”或1_firma=“Compumail”;1_firma;”“)
位于列标题中,因此现在我只有三家供应商及其价格的数据

当前表列和字段(继续10个供应商和价格,例如总共20列):

期望输出:

+-----------+------------------+--------+------------------+--------+------------------+--------+
|  ItemID   |     1_firma      | 1_pris |     2_firma      | 2_pris |     3_firma      | 3_pris |
+-----------+------------------+--------+------------------+--------+------------------+--------+
| F20224236 |                  |        |                  |        |                  |        |
| F974711   | CompuMail        |     10 |                  |        |                  |        |
| 621893    | ComputerSalg A/S |     10 |                  |        |                  |        |
| 107886    | CompuMail        |     10 |                  |        |                  |        |
| 575788    | CompuMail        |     10 | ComputerSalg A/S |     10 |                  |        |
| 243652    | CompuMail        |     10 |                  |        |                  |        |
| 752734    | ComputerSalg A/S |     10 | CompuMail        |     10 |                  |        |
| 717978    | CompuMail        |     10 |                  |        |                  |        |
| 885373    | CompuMail        |     10 |                  |        |                  |        |
| F12973464 | Proshop.dk       |     10 |                  |        |                  |        |
| 960583    | CompuMail        |     10 |                  |        |                  |        |
| 960581    | Proshop.dk       |     10 |                  |        |                  |        |
| F12973605 |                  |        |                  |        |                  |        |
| F1486274  | ComputerSalg A/S |     10 | Proshop.dk       |     10 |                  |        |
| F487567   | CompuMail        |     10 |                  |        |                  |        |
| 713000    | CompuMail        |     10 | Proshop.dk       |     10 | ComputerSalg A/S |     10 |
| 984712    | CompuMail        |     10 |                  |        |                  |        |
+-----------+------------------+--------+------------------+--------+------------------+--------+

从第一个表创建n个查询

SELECT ItemID, 1_firma AS x_firma, 1_pris AS x_Pris, "1_firma" As FirmaName FROM Talbe WHERE 1_firma Is Not Null  'qry1
SELECT ItemID, 2_firma AS x_firma, 2_pris AS x_Pris, "2_firma" As FirmaName FROM Talbe WHERE 2_firma Is Not Null  'qry2
SELECT ItemID, 3_firma AS x_firma, 3_pris AS x_Pris, "3_firma" As FirmaName FROM Talbe WHERE 3_firma Is Not Null ' qry3
And so on...
然后,
Union

SELECT * FROM qry1 UNION ALL SELECT * FROM qry2 UNION ALL SELECT * FROM qry3 
这应该是最快的方法

这样,您将获得
575788
和其他键两次。 为了区分你有公司名称的旗帜

更新

这是另一种方法,它有一个更好的数据模型,您可以在所描述的所需输出中做同样的事情

最终结果如下所示:

 ItemID    x_firma           x_pris   FirmaName
F974711   CompuMail            10      1_firma
621893    ComputerSalg A/S     10      1_firma
575788    CompuMail            10      1_firma
575788    ComputerSalg A/S     10      2_firma
713000    CompuMail            10      2_firma
713000    Proshop.dk           10      2_firma
713000    ComputerSalg A/S     10      3_firma

我有一些工作要做,但使用大数据集可能会非常慢

规范化结构将有一对Firma和Pris字段。通过交叉表旋转两组数据可以实现所需的输出。将Firma和Pris值放在一个字段中可以使用一个交叉表。第一步是使用UNION查询重新排列字段

查询1:数据联盟

SELECT ItemID, 1 AS Rank, [1_firma] AS Data, [1_firma] AS Vendor, "Firma" AS Category FROM Table1
UNION SELECT ItemID, 2, [2_firma], [2_firma], "Firma" FROM Table1
UNION SELECT ItemID, 3, [3_firma], [3_firma], "Firma" FROM Table1
UNION SELECT ItemID, 4, [4_firma], [4_firma], "Firma" FROM Table1
UNION SELECT ItemID, 5, [5_firma], [5_firma], "Firma" FROM Table1
UNION SELECT ItemID, 6, [6_firma], [6_firma], "Firma" FROM Table1
UNION SELECT ItemID, 7, [7_firma], [7_firma], "Firma" FROM Table1
UNION SELECT ItemID, 8, [8_firma], [8_firma], "Firma" FROM Table1
UNION SELECT ItemID, 9, [9_firma], [9_firma], "Firma" FROM Table1
UNION SELECT ItemID, 10, [10_firma], [10_firma], "Firma" FROM Table1
UNION SELECT ItemID, 1, [1_pris], [1_firma], "Pris" FROM Table1
UNION SELECT ItemID, 2, [2_pris], [2_firma], "Pris" FROM Table1
UNION SELECT ItemID, 3, [3_pris], [3_firma], "Pris" FROM Table1
UNION SELECT ItemID, 4, [4_pris], [4_firma], "Pris" FROM Table1
UNION SELECT ItemID, 5, [5_pris], [5_firma], "Pris" FROM Table1
UNION SELECT ItemID, 6, [6_pris], [6_firma], "Pris" FROM Table1
UNION SELECT ItemID, 7, [7_pris], [7_firma], "Pris" FROM Table1
UNION SELECT ItemID, 8, [8_pris], [8_firma] ,"Pris" FROM Table1
UNION SELECT ItemID, 9, [9_pris], [9_firma], "Pris" FROM Table1
UNION SELECT ItemID, 10, [10_pris], [10_firma], "Pris" FROM Table1;
查询2:DataUNION\u已筛选

SELECT DataUNION.ItemID, DataUNION.Rank, DataUNION.Data, DataUNION.Vendor, DataUNION.Category
FROM DataUNION
WHERE Vendor="Computersalg" Or Vendor = "Proshop" Or Vendor = "Compumail";
查询3:数据交叉表

TRANSFORM First(DataUNION_Filtered.Data) AS FirstOfData
SELECT DataUNION_Filtered.ItemID
FROM DataUNION_Filtered
GROUP BY DataUNION_Filtered.ItemID
PIVOT [Category] & DCount("*","DataUNION_Filtered", 
              "ItemID='" & [ItemID] & "' AND Rank<" & [Rank] & " AND Data<>Vendor")+1
              In ("Firma1","Pris1","Firma2","Pris2","Firma3","Pris3");

连接10个字段,或者可能使用联合查询,或者更好,规范化数据结构。@June7联合查询如何处理上述数据?我想这只是为了连接多个查询/表?所有数据都在同一个表中,但列不同,联合查询在这里是否仍然适用?是否可以访问Concatenate with out编写一些VBA代码?联合查询可以将多个字段重新排列为单个字段。重新排列将是一种更规范化的结构。数据应该放在首位。串联将与查询中的表达式:
Field1&>,“+Field2&>,“+Field3…”
。建议您的IIf()表达式返回Null而不是“”。然后+字符将连接起来,但如果字段为Null,将返回Null而不仅仅是逗号。但是,我不知道连接如何从最便宜的排列到最昂贵的排列。非规范化的表结构确实对您想要完成的工作提出了挑战。连接将导致一列逗号分隔的值NION查询可以规范化数据结构,然后该查询可以用作后续查询的源,可能是交叉表。为什么pris字段中没有值?最好将样本数据发布为文本表,而不是图像,以便读者可以复制/粘贴数据。我一直在测试我模拟的一些数据。即使使用普通数据,这也很有挑战性结构化。我已经达到了使用VBA和temp表的程度。到目前为止,我测试的查询速度非常慢。我假设有像ItemID和/或ItemDesc这样的字段?实际上有10组firma和pris字段,而不仅仅是3个。然后只需重复10组,并扩展untion查询。这仍然是我认为最好的方法。你不知道吗需要一个轴心或交叉表(大量的内存浪费),只需简单明了的选择查询。最重要的是,你最终有了一个像样的数据模型(如果你加入
ItemID
,你会得到所有
Firm
结果,而
ItemID
)。你忘记了FROM子句。我测试了这种方法,输出不是3对字段。你是对的,我忘记了中的
。你不应该复制粘贴代码,你应该了解它背后的想法。我认为你可以在设计器中创建查询。拖放字段,并将一列过滤为
Null
。我仍然这样做我不知道在没有交叉表的情况下如何得到OP需要的3对字段。你看过我的答案了吗?
TRANSFORM First(DataUNION_Filtered.Data) AS FirstOfData
SELECT DataUNION_Filtered.ItemID
FROM DataUNION_Filtered
GROUP BY DataUNION_Filtered.ItemID
PIVOT [Category] & DCount("*","DataUNION_Filtered", 
              "ItemID='" & [ItemID] & "' AND Rank<" & [Rank] & " AND Data<>Vendor")+1
              In ("Firma1","Pris1","Firma2","Pris2","Firma3","Pris3");
SELECT Table1.ItemID, Firma1, Pris1, Firma2, Pris2, Firma3, Pris3
FROM DataCROSSTAB RIGHT JOIN Table1 ON DataCROSSTAB.ItemID = Table1.ItemID;