Vba 如果许多列的字段为空,则向左移动值
我有如下所示的数据,代表从1到10列出的最便宜的供应商及其特定物品的价格(每行1件/件) 编辑:我已经使用以下步骤将数据缩减到我想要查看的供应商。现在我想将所有数据移到左边,这样我只有6列带有供应商名称/价格的数据(而不是现在的20列) 多个Iif语句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个供应商和价格,
(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;