2014-09-20 3 views
0

Amazon предлагает своим клиентам на рынке информацию о CSV-отчете, который содержит информацию о каждой проданной вами статье. Есть четыре строки в статье, глядя, как это:Объединить поля из разных строк по условию

+----------------------+------------+-------------------+--------+ 
|  orderid  | amounttype | amountdescription | amount | 
+----------------------+------------+-------------------+--------+ 
| 305-2406165-0572365 | ItemPrice | Principal   | 2.98 | 
| 305-2406165-0572365 | ItemPrice | Shipping   | 3.89 | 
| 305-2406165-0572365 | ItemFees | Commission  | -0.45 | 
| 305-2406165-0572365 | ItemFees | ShippingHB  | -0.59 | 
+----------------------+------------+-------------------+--------+ 

Как вы можете видеть, каждая статья имеет четыре ряда, два для фактической продажной цены и два для платы я должен заплатить, чтобы Amazon.

Я импортирую этот CSV-файл в SQL-таблицу, используя MySQL. Выбор некоторых данных, включая цену выглядит следующим образом:

SELECT DISTINCT 
    report.posteddate AS Date, 
    orders.OrderID, 
    orders.ExternalOrderID AS AZNr, 
    report.amount AS ArtPrice 
FROM 
    report, 
    orders 
WHERE 
    orders.ExternalOrderID = report.orderid 
     AND report.amountdescription = 'Principal' 
     AND report.transactiontype = 'Order' 
ORDER by Date DESC 

Чтобы получить только цену товара без груза я сделать выбор, чтобы получить только те строки, где amountdescription является «Главным». Тип транзакции можно игнорировать, чтобы решить мою проблему.

Что я хочу сделать:

Я хочу, чтобы извлечь оба поля суммы, где amounttype является «ItemFees», добавьте их вместе и отображать результат в виде одного поля. После этого выбора, строка должна выглядеть следующим образом:

+------------+---------+---------------------+----------+-------+ 
| Date | OrderID |  AZNr   | ArtPrice | Fees | 
+------------+---------+---------------------+----------+-------+ 
| 24.07.2014 | 267720 | 305-2406165-0572365 | 2.98  | -1.04 | 
+------------+---------+---------------------+----------+-------+ 

Я попытался запустить подзапрос для обоих рядов с выбором для amounttype = «ItemFees» и объединить результаты, но я в конечном итоге с ошибкой сказать, что мой подзапрос возвращает более одной строки. Это запрос:

SELECT DISTINCT 
    report.posteddate AS Date, 
    orders.OrderID, 
    orders.ExternalOrderID AS AZNr, 
    report.amount AS ArtPrice, 
    (SELECT 
      SUM(report.amount) 
     FROM 
      report, 
      orders 
     WHERE 
      orders.ExternalOrderID = report.orderid 
       AND report.amountdescription = 'Commission') + 
    (SELECT 
      SUM(report.amount) 
     FROM 
      report, 
      orders 
     WHERE 
      orders.ExternalOrderID = report.orderid 
       AND report.amountdescription = 'ShippingHB') AS Fees 
FROM 
    report, 
    orders 
WHERE 
    orders.ExternalOrderID = report.orderid 
     AND report.amountdescription = 'Principal' 
     AND report.transactiontype = 'Order' 
ORDER by Date DESC 

Кто-нибудь есть идея, как суммировать два значения из двух разных строк с заданным условием (см WHERE-условие)? Кроме того, мне нужно извлечь стоимость доставки, но я думаю, что это тот же вопрос.

Заранее спасибо.

+0

Вы использовали СУММ (сумму) в своем подзапросе? – Ian

+0

Да, но я только что получил тысячу полей, которые содержали одно и то же значение. – Ceriana

+0

Можете ли вы обновить свой вопрос с полным SQL-запросом, который не работал, включая подзапрос, который дает вам тысячи полей? – Ian

ответ

0

можно вычислить itemprice и itemfees с двумя запросами и присоединиться к ним

select a.orderid, a.price, b.fees 
from (select orderid, sum(amount) price from report where amounttype='ItemPrice' group by orderid) a 
    join (select orderid, sum(amount) fees from report where amounttype='ItemFees' group by orderid) b 
    on a.orderid = b.orderid 

это asumes есть по крайней мере один ряд с itemprice и один ряд с itemfees. иначе вы должны использовать внешнее соединение.

+0

Спасибо, подводя итоги сборов! Но есть проблема с ценой: по вашему запросу расчетная цена содержит доставку, но я хочу написать ее в своем поле. Как я могу извлечь его с помощью вашего JOIN-запроса? Я уже исключил его из расчетной цены, но мне трудно получить ее в своей области. Другое дело: в моей таблице «заказы» - еще один OrderID, который тоже нужно извлечь (см. Мой первый запрос). Я попытался просто добавить «заказы» в предложение FROM, но я не знаю, как создать выделение, которое я сделал с order.ExternalOrderID = report.orderid в моем первом запросе. – Ceriana

+0

невредим, сделал это после некоторой попытки и ошибки. еще раз спасибо! – Ceriana

+0

не мог ответить раньше. Я рад, что вы это поняли. – 1010

Смежные вопросы