У меня есть кое-что для работы, но это может быть очень медленно с большим набором данных.
Нормализованная структура будет иметь одну пару полей Firma и Pris. Ваш желаемый результат может быть достигнут путем поворота двух наборов данных через CROSSTAB. Один CROSSTAB можно использовать, поместив значения Firma и Pris в 1 поле. Первый шаг - переупорядочить поля с помощью запроса UNION.
Запрос1: DataUNION
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_Filtered
SELECT DataUNION.ItemID, DataUNION.Rank, DataUNION.Data, DataUNION.Vendor, DataUNION.Category
FROM DataUNION
WHERE Vendor="Computersalg" Or Vendor = "Proshop" Or Vendor = "Compumail";
Запрос3: DataCROSSTAB
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");
Если вы хотите, чтобы критерии фильтра в Query2 были динамическими (и для получения дополнительной информации о запросе CROSSTAB), просмотрите http://allenbrowne.com/ser-67.html#Param
Однако элементы, у которых нет данных для выбранных поставщиков, не будут отображаться в выводе CROSSTAB. ,Присоедините CROSSTAB к таблице всех элементов в четвертом запросе. Я полагаю, ваш оригинальный стол мог бы послужить этой цели.
SELECT Table1.ItemID, Firma1, Pris1, Firma2, Pris2, Firma3, Pris3
FROM DataCROSSTAB RIGHT JOIN Table1 ON DataCROSSTAB.ItemID = Table1.ItemID;