2014-09-06 3 views
2

Я пытаюсь написать запрос, чтобы получить начальные и конечные сериалы для конкретной продажиSql запроса для начала и конца колонны

Serial Sale_id 
0001  1 
0002  1 
0003  1 
0004  2 
0005  2 
0006  1 
0007  1 
0008  1 

Ищу результат как

Quantity  Start End 
3   0001  0003 
3   0006  0008 

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

ответ

2

Этот запрос (адаптировано из книги SQL MVP Deep Dives) должен дать вам то, что вы хотите:

SELECT 
    Sale_id, --optional, include is you want the Sale_id 

    -- if Serial is a (VAR)CHAR type use this field 
    Quantity = MAX(CAST(Serial AS INT)) - MIN(CAST(Serial AS INT)) + 1, 

    -- if Serial is INT already use this field instead 
    --Quantity = MAX(CAST(Serial AS INT)) - MIN(CAST(Serial AS INT)) + 1, 

    [Start] = MIN(Serial), 
    [End] = MAX(Serial) 

FROM (
    SELECT 
    Sale_id, 
    Serial, 
    RowNumber = 
     Serial - ROW_NUMBER() OVER (PARTITION BY Sale_id ORDER BY Serial) 
    FROM YourTable 
) a 
--WHERE Sale_id = 1 -- optional limiting WHERE clause 
--WHERE Sale_id IN (1,2) -- optional limiting WHERE clause 
GROUP BY Sale_id, RowNumber 
ORDER BY Start; 

я сделал предположение, что Serial хранится в виде символьного типа и включает в себя приведение к INT. Если это уже числовой тип, замените строку без литой для Quantity.

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

Sample SQL Fiddle

Пример вывод:

Sale_id  Quantity Start  End 
----------- ----------- ---------- ---------- 
1   3   0001  0003 
2   2   0004  0005 
1   3   0006  0008 

(3 row(s) affected) 
1

Вы можете сделать это, подсчитав количество не похожих идентификаторов продаж перед каждым. Это константа для последовательностей, где идентификаторы продаж одинаковы. Затем используйте это для группировки:

select count(*), min(serial_no), max(serial_no) 
from (select t.*, 
      (select count(*) 
       from taple t2 
       where t2.serial_no <= t.serial_no and 
        t2.sale_id <> t.sale_id 
      ) as grp 
     from taple t 
    ) t 
group by grp; 

Если вы только заботиться о sale_id = 1 затем поставить условие where в запросе среднего подзапроса.

Here - это скрипт SQL.

+0

Hi <спасибо за ваш ответ, я пытаюсь это одно, но выглядит не работает я упускаю некоторые вещи? вот мой код – Srikanth

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