2015-01-09 3 views
1

Я пытаюсь создать хранимую процедуру, которая вернет данные для отчета Crystal Reports. Внутри CR Я использую расположение нескольких столбцов.Заказывать строки по ntile и row_number

Я хочу, чтобы получить 3 макета колонки что-то вроде этого:

1 5 8 
2 6 9 
3 7 10 
4 

Но поскольку CR имеет некоторые проблемы компоновки он заказывает мой стол, как это:

1 2 3 
4 5 6 
7 8 9 
10 

Так я пытался создайте процедуру, которая вернет дополнительный столбец, по которому я буду сортировать свои данные.

Таким образом, вместо того, 1,2,3,4- мне нужно 1,4,7,10,2,5,8,3,6,9 ...

У меня есть таблица с этими данными:

ID | CASE_ID | CASE_DATE 
-------------------------- 
1 | 1  | 2014-02-03 
2 | 1  | 2014-02-04 
3 | 1  | 2014-02-05 
4 | 1  | 2014-02-06 
5 | 1  | 2014-02-07 
6 | 1  | 2014-02-08 
7 | 1  | 2014-02-09 
8 | 1  | 2014-02-10 
9 | 1  | 2014-02-11 
10 | 1  | 2014-02-12 

и мне нужно хранимую процедуру, которая будет возвращать эти данные:

ID | CASE_ID | CASE_DATE | ORDER 
--------------------------------- 
1 | 1  | 2014-02-03 | 1 
2 | 1  | 2014-02-04 | 5 
3 | 1  | 2014-02-05 | 8 
4 | 1  | 2014-02-06 | 2 
5 | 1  | 2014-02-07 | 6 
6 | 1  | 2014-02-08 | 9 
7 | 1  | 2014-02-09 | 3 
8 | 1  | 2014-02-10 | 7 
9 | 1  | 2014-02-11 | 10 
10 | 1  | 2014-02-12 | 4 

Вот SQL скрипку с данными выборки и мой код: http://sqlfiddle.com/#!3/c24c1/1

Идея колонки сортировки:

  1. делят все строки на 3 группы (NTILE), принять первый элемент из первой группы, то сначала из второй и первой из третьей группы

РЕДАКТИРОВАТЬ: Здесь мое временное решение, я надеюсь, что запуск этого будет уточнить, что я имел в виду, когда я задаю этот вопрос:

--DECLARE @NUM INT; 
--SET @NUM=3; 

SELECT ID, 
     CASE_ID, 
     CONVERT(NVARCHAR(10),CASE_DATE,121) AS DATA, 
     (ROW1 - 1) * 3/*@NUM*/ + COL AS [ORDER] 
FROM 
    (SELECT CASE_ID, 
      ID, 
      ROW AS LP, 
        COL, 
        ROW_NUMBER() OVER (PARTITION BY CASE_ID, COL ORDER BY ROW) AS ROW1, 
        CASE_DATE 
    FROM 
    (SELECT ROW_NUMBER() OVER (PARTITION BY D.CASE_ID ORDER BY D.ID) AS ROW, 
      NTILE(3/*@NUM*/) OVER (PARTITION BY D.CASE_ID ORDER BY D.ID) AS COL, 
      ID, 
      D.CASE_ID, 
      CASE_DATE 
     FROM DATA D 
     WHERE D.CASE_ID = 1)X)Y 
ORDER BY Y.CASE_ID, 
     LP 
+0

что логика колонке заказа ?? –

+0

@Ganesh_Devlekar Crystal Reports создает столбец поперек вниз (как показано во второй таблице, сверху), если я хочу правильно отображать данные. Мне нужно как-то заказать его. Идея состоит в том, чтобы разделить все строки на 3 столбца, а затем взять первую строку после того, как они помещают вторую строку и так далее. Извините, но я не говорю по-английски. – Misiu

+0

Я не понимаю. Почему вторая строка дает заказ «5»? Из того, что я могу сказать, вам нужно значение в первом столбце второй строки. –

ответ

0

Edit: Похоже, что вы на самом деле хотите, ORDER, а не только для возврата столбцов в этом порядке.

SELECT ID, 
    CASE_ID, 
    DATA, 
    ROW_NUMBER() OVER (ORDER BY ROW, N) AS [ORDER] 
FROM (
    SELECT ID, 
     CASE_ID, 
     N, 
     ROW_NUMBER() OVER (PARTITION BY CASE_ID, N ORDER BY ID) AS ROW, 
     DATA 
    FROM (
     SELECT 
      ID, 
      CASE_ID, 
      NTILE(3) OVER (PARTITION BY CASE_ID ORDER BY ID) AS N, 
      CONVERT(NVARCHAR(10), CASE_DATE,121) AS DATA 
     FROM DATA 
     WHERE CASE_ID = 1) X) Y 
ORDER BY ID; 

SQLFiddle

+0

Я добавил временное решение, возможно, это немного изменит мой вопрос. – Misiu

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