Можно ли преобразовать мою таблицу в другой формат с помощью SQLlite? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь преобразовать таблицу в другой формат на этом изображении.

Изображение:

image

Ниже приведены данные. В моей базе данных есть таблица, заголовки столбцов которой в настоящее время определены как col_0 ... col_7.

+----------+------------------+-------------+--------------+-------------+--------------+-------------+--------------+
|  col_0   |      col_1       |    col_2    |    col_3     |    col_4    |    col_5     |    col_6    |    col_7     |
+----------+------------------+-------------+--------------+-------------+--------------+-------------+--------------+
|          |                  | Spoon       |              | Fork        |              | Knife       |              |
| Location | Market Postcode  | Trade Price | Retail Price | Trade Price | Retail Price | Trade Price | Retail Price |
| Market A | AAA111           | 0.5         | 1            | 0.6         | 1.1          | 0.55        | NA           |
| Market B | BBB111           | 0.7         | 2            | 0.8         | 1.5          | NA          | NA           |
+----------+------------------+-------------+--------------+-------------+--------------+-------------+--------------+ 

Я хочу, чтобы это было преобразовано таким образом, чтобы я мог видеть торговые и розничные цены каждого продукта для рынков A и B.

+----------+------------------+---------+-------------+--------------+
|  col_0   |      col_1       |  col_2  |    col_3    |    col_4     |
+----------+------------------+---------+-------------+--------------+
| Location | Market Post Code | Product | Trade Price | Retail Price |
| Market A | AAA111           | Spoon   | 0.5         | 1            |
| Market A | AAA111           | Fork    | 0.6         | 1.1          |
| Market A | AAA111           | Knife   | 0.55        | NA           |
| Market B | BBB111           | Spoon   | 0.7         | 2            |
| Market B | BBB111           | Fork    | 0.8         | 1.5          |
| Market B | BBB111           | Knife   | NA          | NA           |
+----------+------------------+---------+-------------+--------------+

Я очень плохо знаком с SQL и SQL lite, и было бы неплохо, если бы кто-то мог мне помочь с этим?

Спасибо

1 Ответ

0 голосов
/ 29 мая 2019

Да, но это неудобно, вот пример: -

-- Create the original data
DROP TABLE IF EXISTS original;
CREATE TABLE IF NOT EXISTS original (COL_0 TEXT, COL_1 TEXT, COL_2 TEXT, COL_3 TEXT, COL_4 TEXT, COL_5 TEXT, COL_6 TEXT, COL_7 TEXT);
INSERT INTO original VALUES
    (null,null,'Spoon','','Fork','','Knife',''),
    ('Location','Market Postocde','Trade Price','Retail Price','Trade Price','Retail Price','Trade Price','Reatail Price'),
    ('Market A','AAA111',0.5,1,0.6,1.1,0.55,'NA'),
    ('Market B','BBB111',0.7,2,0.8,1.5,'NA','NA')
;
SELECT * FROM original;

-- Prepare to create the transformed
DROP TABLE IF EXISTS transformed;
CREATE TABLE IF NOT EXISTS transformed (COL_0 TEXT, COL_1 TEXT, COL_2 TEXT, COL_3 TEXT, COL_4 TEXT);


WITH 
    item1 AS (SELECT COL_2 FROM original WHERE (length(COL_0) < 1 AND LENGTH(COL_1) < 1) OR (COL_0 IS NULL AND COL_1 IS NULL) ),
    item2 AS (SELECT COL_4 FROM original WHERE (length(COL_0) < 1 AND LENGTH(COL_1) < 1) OR (COL_0 IS NULL AND COL_1 IS NULL)),
    item3 AS (SELECT COL_6 FROM original WHERE (length(COL_0) < 1 AND LENGTH(COL_1) < 1) OR (COL_0 IS NULL AND COL_1 IS NULL)),

    full1 AS (SELECT COL_0, COL_1,(SELECT * FROM item1),COL_2,COl_3 FROM original WHERE length(COL_1) = 6),
    full2 AS (SELECT COL_0, COL_1,(SELECT * FROM item2),COL_4,COL_5 FROM original WHERE length(COL_1) = 6),
    full3 AS (SELECT COL_0, COL_1,(SELECT * FROM item3),COL_6,COL_7 FROM original WHERE length(COL_1) = 6),

    reformed AS (SELECT * FROM full1 UNION SELECT * FROM full2 UNION SELECT * FROM full3)

    INSERT INTO transformed SELECT * FROM reformed
;

SELECT * FROM transformed;

Объяснение

Этап 1 - Создание исходных данных

В соответствии с комментариями созданы исходные данные, результат выбора: -

enter image description here

Вышеуказанное также было выполнено с использованием: -

enter image description here

  • т.е. col_0 и COL_1 могут быть либо пустыми, либо нулевыми, если строка содержит два элемента.

Этап 2 - Подготовка

На следующем этапе создается таблица с именем преобразованный, в которой можно получить преобразованные данные (т. Е. Таблица с 5 столбцами).

Стадия 3 - Преобразование

Это создает 2 набора из 3 общих табличных выражений (т.е. есть 3 элемента) и окончательный CTE (преобразованный), который объединяет 2-й набор CTE, который затем передается INSERT в подготовленную таблицу результатов с именем трансформируются .

Первый набор, только определенные элементы генерируются путем обработки исходной таблицы и выбора только столбца, в котором будет найден элемент, то есть строк, где COl_0 и COL_1 являются пустой строкой или равны нулю.

Второй набор получает столбцы с данными, относящимися к элементу И элементом из соответствующего элемента? КТР. Критерием включения является то, что этот рыночный код имеет длину 6 символов.

Преобразованный CTE объединяет три CTE из второго набора в один CTE.

Наконец, преобразованный CTE используется для загрузки преобразованного стола.

Предполагалось, что заголовки не требуются, так как обычно они не сохраняются в качестве фактических данных.

Результат: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...