Упорядочить по SQL - установить вывод, как если бы он строил два столбца - PullRequest
0 голосов
/ 10 мая 2018

У меня есть такой вывод: 1,2,3,4,5,6,7, но он должен быть примерно таким: 1,5,2,6,3,7,4 или, например, 1,2,3, 4,5,6,7,8 в 1,5,2,6,3,7,4,8

1 2      1 5
3 4  OR  2 6
5 6      3 7
7        4 

должно быть так:

1 2      1 5
3 4   OR 2 6
5 6      3 7
7 8      4 8

ОБНОВЛЕНО: результат должен быть только один столбец

1             1
2             5
3             2
4     -->     6
5             3
6             7
7             4

Это для динамического создания этого HTML: enter image description here

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

РЕДАКТИРОВАТЬ: http://sqlfiddle.com/#!9/57f28d/3

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Попробуйте это ... (используя случай)

Раствор 01

DECLARE @cnt int = (SELECT count(*) from Dummy)

SELECT 
case when VAL <= @cnt/2 then VAL end col1,
case when VAL <= @cnt/2 then VAL + @cnt/2 end col2
FROM Dummy
where VAL <= @cnt/2 

Выход

+------+------+
| col1 | col2 |
+------+------+
|    1 |    5 |
|    2 |    6 |
|    3 |    7 |
|    4 |    8 |
+------+------+

Онлайн-демонстрация: http://sqlfiddle.com/#!18/57f28/58/0

Решение 02

SELECT
case when (VAL%2) = 1 then VAL end as col1,
case when (VAL%2) = 1 then VAL + 1 end as col2
FROM Dummy
where VAL%2 = 1

выход

+------+------+
| col1 | col2 |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|    7 |    8 |
+------+------+

Онлайн-демонстрация: http://sqlfiddle.com/#!18/57f28/76/0

Обновлено 01 ...

Решение 01

DECLARE @cnt INT = (SELECT Count(*) FROM   dummy) 

SELECT CASE 
         WHEN val <= @cnt / 2 THEN CONVERT(NVARCHAR(5), val) + ' ' 
                                   + CONVERT(NVARCHAR(5), val + @cnt/2) 
       END col1 
FROM   dummy 
WHERE  val <= @cnt / 2 

выход

+------+
| col1 |
+------+
|  1 5 |
|  2 6 |
|  3 7 |
|  4 8 |
+------+

Онлайн-демонстрация: http://sqlfiddle.com/#!18/57f28/124/0

Решение 02

SELECT CASE 
         WHEN ( val%2 ) = 1 THEN CONVERT(NVARCHAR(5), val) + ' ' 
                                 + CONVERT(NVARCHAR(5), (val + 1)) 
       END AS col1 
FROM   dummy 
WHERE  val%2 = 1 

выход

+------+
| col1 |
+------+
|  1 2 |
|  3 4 |
|  5 6 |
|  7 8 |
+------+

Онлайн демо: http://sqlfiddle.com/#!18/57f28/114/0

Обновлено 02 ...

SELECT id, 
       CASE 
         WHEN colab = 0 THEN colab2 + (SELECT Count(*) FROM dummy) / 2 ELSE colab2 
       END OutputCol 
FROM   (SELECT id, 
               (id%2) AS colAB, 
               Row_number() OVER (partition BY (id%2) ORDER BY id) AS colAB2 
        FROM   dummy) t1 
ORDER  BY id 

выход

+----+-----------+
| id | OutputCol |
+----+-----------+
|  1 |         1 |
|  2 |         5 |
|  3 |         2 |
|  4 |         6 |
|  5 |         3 |
|  6 |         7 |
|  7 |         4 |
|  8 |         8 |
+----+-----------+

Примечание. Вы можете удалить столбец ID и получить только один столбец (OutputCol), если хотите.

SELECT id, CASE WHEN colab....

Онлайн-демонстрация: http://sqlfiddle.com/#!18/57f28/257/1

0 голосов
/ 10 мая 2018

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

select  min(val), nullif(max(val), min(val))
from
(
  select 
    val,
    row_number() over (order by val) as rn,
    count(*) over () as cnt
  from dummy 
) numbered
group by rn % ((cnt+1) / 2)
order by min(val);

Результат:

1 | 2
3 | 4
5 | 6
7 | 8

Скрипка SQL: http://sqlfiddle.com/#!18/57f28/118

ОБНОВЛЕНИЕ: Вы просто хотите упорядочить отдельные значения, чтобы их можно было легко прочитать в цикле и создать из него таблицу HTML. Поэтому используйте ROW_NUMBER OVER и COUNT OVER в предложении ORDER BY:

select val
from dummy 
order by 
  (row_number() over (order by val) - 1) % ((count(*) over () + 1) / 2),
  row_number() over (order by val);

Скрипка SQL: http://sqlfiddle.com/#!18/25a5e/1

Кстати, это легко адаптировать. Если вы хотите создать три столбца вместо двух, например, просто измените / 2 на / 3 (SQL-скрипта http://sqlfiddle.com/#!18/25a5e/2).

0 голосов
/ 10 мая 2018

Может быть, что-то подобное будет работать. Используется ROW_NUMBER () для нумерации каждой строки последовательно. Затем самостоятельно присоедините один номер строки к предыдущему номеру строки. Фильтруйте только нечетные строки.

SQL Fiddle

;WITH cte AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn
FROM dummy)


SELECT c1.val, c2.val
FROM cte c1
LEFT JOIN cte c2 ON c2.rn - 1  = c1.rn
WHERE c1.rn % 2 = 1
...