2016-06-27 3 views
0

Я пишу запрос, который должен выбрать несколько информации. В таблице ниже:Подсчитать дни между датами в два ряда по условию

ID ID-Toner Quantity Location Order_date Send_date 
1  2   1   55  20.01.2015 26.01.2015 
2  2   1   41  22.02.2015 26.02.2015 
3  2   1   35  23.02.2015 26.02.2015 
4  5   1   77  25.02.2015 25.02.2015 
5  2   1   55  25.02.2015 26.02.2015 

Мне нужно, чтобы выбрать все столбцы и дополнительный столбец с количеством дней между двумя датами: order_date и предыдущая order_date для размещения = т .: 55. результат выборки должен выглядеть следующим образом:

ID ID-Toner Quantity Location Order_date Send_date Number_of_days 
1  2   1  55  20.01.2015 26.01.2015  0 
5  2   1  55  25.02.2015 26.02.2015  36 

Как выбрать такой запрос?

+2

Добавить ожидаемый результат. – jarlh

+1

Тег используемого dbms. (Когда дело доходит до даты/времени, многие продукты далеки от соответствия ANSI SQL.) – jarlh

+0

Мы не можем ответить на это, не зная вашу базу данных. –

ответ

0

обновляется после уточнений в ПО

let'say, что он должен сделать своего рода агрегирования по данным называемых рейтинга, что является одним из видов классификации на основе нумерации в строках для того, последовательность tbale в.

В нашем случае заказ предоставляется по дате заказа.

Это довольно кросс-dbms-решение (поля даты suppased для типа Datetime, а DATEDIFF - это функция MySql), поэтому я считаю, что вы можете легко адаптироваться к своим dbms.

Вы можете попробовать SQL на Sql Fiddle в http://sqlfiddle.com/#!9/290e9

Table

CREATE TABLE Orders 
    (`ID` int, `IDToner` int, `Quantity` int, `Location` int, `Order_date` Date, `Send_date` Date) 
; 

INSERT INTO Orders 
    (`ID`, `IDToner`, `Quantity`, `Location`, `Order_date`, `Send_date`) 
VALUES 
    (1, 2, 1, 55, STR_TO_DATE('20.01.2015','%d.%m.%Y'), STR_TO_DATE('26.01.2015','%d.%m.%Y')), 
    (2, 2, 1, 41, STR_TO_DATE('22.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')), 
    (3, 2, 1, 35, STR_TO_DATE('23.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')), 
    (4, 5, 1, 77, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('25.02.2015','%d.%m.%Y')), 
    (5, 5, 1, 77, STR_TO_DATE('25.04.2015','%d.%m.%Y'), STR_TO_DATE('25.04.2015','%d.%m.%Y')), 
    (6, 5, 1, 77, STR_TO_DATE('25.06.2015','%d.%m.%Y'), STR_TO_DATE('25.06.2015','%d.%m.%Y')), 
    (7, 5, 1, 77, STR_TO_DATE('25.08.2015','%d.%m.%Y'), STR_TO_DATE('25.08.2015','%d.%m.%Y')), 
    (8, 2, 1, 55, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')) 
; 


Query

SELECT 
     ID, 
     ID_Toner, 
     Quantity, 
     Location, 
     Order_date, 
     Send_date,   
     days_from_previous_order 
FROM(
    SELECT 
     current_ID AS ID, 
     current_IDToner AS ID_Toner, 
     current_Quantity AS Quantity, 
     current_Location AS Location, 
     current_Send_Date AS Send_date,   
     current_Order_Date AS Order_date, 
     previous_Order_Date, 
     COALESCE(DATEDIFF(current_Order_Date, previous_Order_Date),0) AS days_from_previous_order 
    FROM(
     SELECT 
       TabOrdersRanking_currents.ID AS current_ID, 
       TabOrdersRanking_currents.IDToner AS current_IDToner, 
       TabOrdersRanking_currents.Quantity AS current_Quantity, 
       TabOrdersRanking_currents.Location AS current_Location, 
       TabOrdersRanking_currents.Send_Date AS current_Send_Date,   
       TabOrdersRanking_currents.Order_Date AS current_Order_Date, 
       TabOrdersRanking_previous.Order_Date AS previous_Order_Date 
     FROM(
      SELECT Orders.*, @rank1 := @rank1 + 1 rank 
      FROM Orders 
      ,(Select @rank1 := 0) r1 
      order by location, order_date 
     ) TabOrdersRanking_currents 
     LEFT JOIN( 
      SELECT Orders.*, @rank2 := @rank2 + 1 rank 
      FROM Orders 
      ,(Select @rank2 := 0) r2 
      order by location, order_date 
     ) TabOrdersRanking_previous 
     on TabOrdersRanking_currents.Location = TabOrdersRanking_previous.Location 
     and TabOrdersRanking_currents.rank - TabOrdersRanking_previous.rank = 1  
) TabOrdersSuccessionRanking 
) TabWithDaysFromPrevious; 
+0

почти работает, столбец «lastdate» должен показывать дату текущего заказа для местоположения, а не последнюю дату для местоположения. Это трудно объяснить. Пример: я заказал продукт 2015-02-10, предыдущий заказ был 2015-01-1. В столбце «дни» должна отображаться разница между этими двумя датами, а не последней датой заказа и предыдущей. – bgolemba

+0

Если я понимаю, что вы просто добавили фильтрацию причины на lastdate –

+0

Не совсем, в столбце «lastdate» показана последняя дата, а не дата заказа для этой записи – bgolemba