2012-04-13 5 views
0

У меня есть таблица Сделка со следующей колонкой и данныеMYSQL запрос, чтобы получить разницу дат

id transaction_date trans_type account_id agents_id transaction_date price miles 
1 2012-02-08  Buy  1   1   2010-02-08  0.016 12000 
2 2012-03-01  Sell  2   2   2012-03-10  0.256 -2000 
3 2012-03-27  Buy  3   3   2012-03-27  0.256 10000 
4 2012-03-28  Sell  4   4   2012-03-28  0.589 -11000 
5 2012-03-29  Buy  5   5   2012-03-29  0.87 25000 
6 2012-03-29  Sell  6   6   2012-02-29  0.879 -12000 
7 2012-04-01  Sell  7   7   2012-04-01  0.058 -15000 

    Account Table 
    id Program_id 
    1  1 
    2  1 
    3  2 

    Program table 
    id  Abbreviation 
    1  AA 
    2  AC 

    Agents table 
    id  Name 
    1  Bob 
    2  Ben 

Я хочу, чтобы получить первую дату распродажи и первую дату покупки, чтобы получить среднее количество дней до того, как сделка будет продана, чтобы получить дни сделка в инвентаре, поэтому он должен быть

(Sell date)2012-03-01 - (Buy date)2012-02-08 

им пытаются это

SELECT 
    case when t.trans_type ='Sell' then transaction_date end as SellDate 
    ,case when t.trans_type ='Buy' then transaction_date end as BuyDate 
    ,DATEDIFF(case when t.trans_type ='Sell' then transaction_date end 
      ,case when t.trans_type ='Buy' then transaction_date end) as Date 
    ,transaction_date 
FROM transactions t 
order by transaction_date 

Но всегда получаю NULL в Дата

Вот полный запрос,

SELECT p.abbreviation,ag.name 
    ,sum(-1.00 * t.miles * t.price - coalesce(t.fees,0) - coalesce(c.cost,0)) as profit 
    ,sum(t.miles) 'Totakl Miles' 
    ,avg(price/miles) 'Average' 
    ,transaction_date 
FROM transactions t 
inner join accounts a on t.account_id = a.id 
inner join programs p on a.program_id = p.id 
inner join agents ag on t.agent_id = ag.id 
LEFT JOIN (
      SELECT rp.sell_id, sum(rp.miles * t.price) as cost 
      from report_profit rp 
      inner join transactions t on rp.buy_id = t.id 
      where t.miles > 50000 
      group by rp.sell_id 
      order by rp.sell_id 
     ) c on t.id = c.sell_id 
where t.transaction_date BETWEEN '2012-03-14' AND '2012-04-14' 
Group by p.id , ag.id 

EDIT

Я попытался liquorvicar ответ, но он дает ошибку «Sub-запрос возвращал более одной записи» из-за Группа по i добавлена ​​

Любой может провести меня по этому вопросу?

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

+0

Получил пример запроса и результата? Вам нужно передать 2 аргумента DATEDIFF, так как это выглядит для меня, вы передаете только один аргумент в DATEDIFF, потому что ваш оператор case даст только одну дату. – Rob

+0

Это потому, что вы работаете только по одной строке за раз, что означает, что ваш «датифф» всегда получает «нуль» для одной из дат. Вам потребуется самостоятельное присоединение к «транзакциям», чтобы соответствовать «Записи покупок» с документами «Продать». –

+0

У вас нет ключа, который связывает транзакции покупки и продажи. Откуда вы знаете, какая сделка по продаже относится к какой транзакции покупки? – nnichols

ответ

0

в первую очередь спасибо всем за каждую помощь

Вот запрос, который возвращает точный результат

select p_id,ag_id, 
    p_abb,ag_name 
    ,sum(-1.00 * miles * price - coalesce(fees,0) - coalesce(cost,0)) as profit 
    ,sum(miles) 'Total Miles',avg(price/miles) 'Average' 
    ,DATEDIFF(min(buy_dt),min(sell_dt)) as 'Days' 
    From 
    (
     SELECT p.id 'p_id',ag.id 'ag_id',p.abbreviation 'p_abb',ag.name 'ag_name' 
     ,miles 
     ,price 
     ,fees 
     ,c.cost 
     ,case when t.trans_type ='Sell' then transaction_date end 'sell_dt' 
     ,case when t.trans_type ='Buy' then transaction_date end 'buy_dt' 
     ,transaction_date 
     FROM transactions t 
     inner join accounts a on t.account_id = a.id 
     inner join programs p on a.program_id = p.id 
     inner join agents ag on t.agent_id = ag.id 
     LEFT JOIN (
      SELECT rp.sell_id, sum(rp.miles * t.price) as cost 
      from report_profit rp 
      inner join transactions t on rp.buy_id = t.id 
      where t.miles > 50000 
      group by rp.sell_id 
      order by rp.sell_id 
     ) c on t.id = c.sell_id 

) t1 
    group by p_id, ag_id 

Спасибо всем еще раз ..

1

Try подзапросов как этот

SELECT 
    DATEDIFF(
     (
     SELECT MIN(date) 
     FROM Transaction 
     WHERE trans_type='Sell' 
    ) AS first_sell_date 
    , 
     (
     SELECT MIN(date) 
     FROM Transaction 
     WHERE trans_type='Buy' 
    ) AS first_buy_date 
    ) 

EDIT: После OP комментарии и обновляя вопрос с полным запросом.

Можете ли вы не просто обернуть DATEDIFF вокруг MIN звонка?

DATEDIFF(
    MIN(case when t.trans_type ='Sell' then transaction_date end), 
    MIN(case when t.trans_type ='Buy' then transaction_date end) 
) as Date 
+0

Liquorvicar, спасибо за ваш ответ, но есть ли другой лучший способ, на самом деле я есть много данных для извлечения с большим количеством подключений. –

+0

Если ваш запрос намного сложнее, вам нужно включить детали в свой вопрос. Мы не читатели разума, по крайней мере, я не :) – nnichols

+0

@AnilD Я тоже не читатель ума ... – liquorvicar

0

Как об этом -

SELECT *, DATEDIFF(sale.transaction_data, purchase.transaction_date) 
FROM transactions purchase 
INNER JOIN (
    SELECT * 
    FROM transactions 
    WHERE trans_type = 'Sell' 
    ORDER BY transaction_date ASC 
) sale 
    ON purchase.transaction_date < sale.transaction_date 
WHERE purchase.trans_type = 'Buy' 
GROUP BY purchase.transaction_date 

Это будет связывать все купить сделки по следующей сделке продажи на основе даты.

Или, может быть что-то вроде этого -

SELECT DATEDIFF((SELECT MIN(transaction_date) 
       FROM transactions t 
       WHERE t.trans_type = 'Sell' 
       AND t.transaction_date > purchase.transaction_date), 
      purchase.transaction_date) 
FROM transactions purchase 
WHERE trans_type = 'Buy' 
Смежные вопросы