Member 14476015 Ответов: 2

Как написать запрос SQP (SELECT)


Привет, я хочу создать новую таблицу, беря данные из другой. Исходная таблица имеет 3 столбца: Order_ID, Meta_Key, Meta_Value.

Meta_Key-это различные подэлементы, которые повторяются для каждого Order_ID, значение которых определено в столбце Meta_Value:

Order_ID / Meta_Key / Meta_Value
1 / product_id / 101
1 / Кол-во / 1
1 / всего / 20
2 / product_id / 105
2 / кол-во / 2
2 / всего / 100
3 / product_id / 102
3 / Кол-во / 1
3 / всего / 30
...

Каким будет SQL-запрос для получения новой таблицы? со следующими столбцами:

Order_ID / product_id / кол-во / общая
1 / 101 / 1 / 20
2 / 105 / 2 / 100
3 / 102 / 1 / 30

Спасибо за вашу помощь.
3
2
3

Что я уже пробовал:

Как написать SQL-запрос (SELECT) для получения новой таблицы. Смотрите описание.
Спасибо.

2 Ответов

Рейтинг:
20

k5054

ИК.
Это сработает если у вас есть только один product_id/qty/total на заказ

SELECT id.Order_ID, product_id, qty, total
FROM  (SELECT Order_ID, Meta_Value AS product_id FROM TheTable WHERE Meta_Key = 'product_id') AS id
JOIN (SELECT Order_ID, Meta_Value AS qty FROM TheTable WHERE Meta_Key = 'qty') AS q  ON (id.Order_ID = q.Order_ID)
JOIN (SELECT Order_ID, Meta_Value AS total FROM TheTable WHERE Meta_Key = 'total') AS t ON (id.Order_ID = t.Order_ID);

Если у вас есть более одного product_id/qty/total на order_id, то вы находитесь в куче проблем - SQL не гарантирует порядок строк, и большинство SQL-движков будут переупорядочивать записи по мере их изменения.


Member 14476015

Спасибо!

Рейтинг:
0

MadMyche

Попробуйте это

DECLARE @Tmp TABLE (OrderID INT, Meta_Key varchar(16), Meta_Value INT)
INSERT @Tmp
VALUES (1 ,'product_id', 101)
,     (1 ,'qty', 1)
,     (1 ,'total', 20)
,     (2 ,'product_id', 105)
,     (2 ,'qty', 2)
,     (2 ,'total', 100)
,     (3 ,'product_id', 102)
,     (3 ,'qty', 1)
,     (3 ,'total', 30)

DECLARE @Tmp2 TABLE (OrderID INT, ProductID INT, Qty INT, Total INT)
INSERT @Tmp2 (OrderID) SELECT Distinct OrderID FROM @Tmp

UPDATE	n
SET		n.ProductID = P.Meta_Value
,		n.Qty = Q.Meta_Value
,		n.Total = t.Meta_Value

FROM		@Tmp2  n
INNER JOIN @Tmp  p ON n.OrderID = p.OrderID AND p.Meta_Key = 'product_id'
INNER JOIN @Tmp  q ON n.OrderID = q.OrderID AND q.Meta_Key = 'qty'
INNER JOIN @Tmp  t ON n.OrderID = t.OrderID AND t.Meta_Key = 'Total'

SELECT * FROM @Tmp2
Вы, вероятно, могли бы сделать это с помощью PIVOT и подзапросы, но эта схема достаточно проста, чтобы сделать это таким образом