Переместить значение влево, если поле пустое для большого количества столбцов - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть данные, как показано ниже, представляющие самых дешевых поставщиков, перечисленных от 1 до 10, вместе с их ценами на конкретный товар (1 предмет / посуда для каждой строки).

Редактировать: я использовал следующие шаги, чтобы свести данные к поставщикам, на которых я хочу посмотреть. Теперь я хотел бы переместить все оставленные данные, чтобы у меня было только 6 столбцов с именами / ценой поставщика (вместо 20 имеющихся у меня столбцов).

Несколько операторов Iif (Iif(1_firma = "Computersalg" Or 1_firma = "Proshop" Or 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 |
+-----------+------------+--------+------------------+--------+------------------+--------+

Желаемый результат:

+-----------+------------------+--------+------------------+--------+------------------+--------+
|  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 |                  |        |                  |        |
+-----------+------------------+--------+------------------+--------+------------------+--------+

Ответы [ 2 ]

1 голос
/ 14 ноября 2019

У меня есть кое-что для работы, но это может быть очень медленно с большим набором данных.

Нормализованная структура будет иметь одну пару полей 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;
0 голосов
/ 14 ноября 2019

Создайте 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
...