Как получить результат в формате ниже в SQL Server? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть таблица рецептов со следующими данными.

page_no title
-----------------
1       pancake
2       pizza
3       pasta
5       cookie

page_no 0 всегда пусто, а отсутствующие page_no пусты, я хочу выводить, как показано ниже, для пустых значений NULL в результате.

left_title  right_title
------------------------
NULL           pancake
Pizza          pasta
NULL           cookie

Я пробовал этот оператор SQL, но он не возвращает желаемый результат:

SELECT
    CASE WHEN id % 2 = 0 
            THEN title 
    END AS left_title,
    CASE WHEN id %2 != 0 
            THEN title 
    END AS right_title
FROM
    recipes

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Использование CTE .. это должно дать вам хороший обзор CTE

DECLARE @table TABLE (
  pageno int,
  title varchar(30)
)

INSERT INTO @table
  VALUES (1, 'pancake')
  , (2, 'pizza')
  , (3, 'pasta')
  , (5, 'cookie')


;
WITH cte_pages
AS (  -- generate page numbers
SELECT
  0 n,
  MAX(pageno) maxpgno
FROM @table
UNION ALL
SELECT
  n + 1 n,
  maxpgno
FROM cte_pages
WHERE n <= maxpgno),
cte_left
AS (   --- even
SELECT
  n,
  ROW_NUMBER() OVER (ORDER BY n) rn
FROM cte_pages
WHERE n % 2 = 0),
cte_right
AS (   --- odd
SELECT
  n,
  ROW_NUMBER() OVER (ORDER BY n) rn
FROM cte_pages
WHERE n % 2 <> 0)
SELECT
  tl.title left_title,
  tr.title right_title    --- final output
FROM cte_left l
INNER JOIN cte_right r
  ON l.rn = r.rn
LEFT OUTER JOIN @table tl
  ON tl.pageno = l.n
LEFT OUTER JOIN @table tr
  ON tr.pageno = r.n
0 голосов
/ 29 апреля 2019

Вы совсем близко.Вам просто нужно агрегировать:

select max(case when id % 2 = 0 then title end) as left_title,
       max(case when id % 2 = 1 then title end) as right_title
from recipes
group by id / 2;

SQL Server выполняет целочисленное деление, поэтому id / 2 всегда является целым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...