Строки Столбцы Траверс - PullRequest
       11

Строки Столбцы Траверс

0 голосов
/ 13 декабря 2018

У меня есть данные в следующем формате

id      idnew
 1       2
 3       4
 2       
 4       7
 6       8
 7

Результат Должно быть что-то вроде этого

Идентификатор должен сопровождаться idnew

 1
 2
 3
 4
 2
 4
 7
 6
 8
 7       


Thanks in advance

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Это полностью протестировано, попробуйте здесь: https://rextester.com/DVZXO21058

Настройка таблицы, как вы описали:

   CREATE TABLE myTable (id INT, idnew INT);

   INSERT INTO myTable (id, idnew)
   VALUES (1, 2),
          (3, 4),
          (2, NULL),
          (4, 7),
          (6, 8),
          (7, NULL);

   SELECT * FROM myTable;

Вот запрос для выполнения трюка:

   SELECT mixed_id FROM
   (
       SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num,
              id,
              idnew
       FROM myTable
   ) AS x
   UNPIVOT
   (
       mixed_id for item in (id, idnew)
   ) AS y
   WHERE mixed_id IS NOT NULL
   ORDER BY row_num, mixed_id;

Чтобы не усложнять запрос, используется преимущество «id», которое ранжируется перед «idnew» как строка.Я считаю, что ранжирование строк здесь не является ключевым вопросом.

0 голосов
/ 18 июня 2019

Использование Cross Apply

;WITH CTE (id,idnew)
AS
(
SELECT 1,2      UNION ALL
SELECT 3,4      UNION ALL
SELECT 2,NULL   UNION ALL
SELECT 4,7      UNION ALL
SELECT 6,8      UNION ALL
SELECT 7,NULL
)
SELECT New 
FROM CTE
CROSS APPLY ( VALUES (id),(idnew))AS Dt (New)
WHERE dt.New IS NOT NULL

Результат

New
---
1
2
3
4
2
4
7
6
8
7
0 голосов
/ 13 декабря 2018

Это должно поддерживать порядок:

 SELECT id
   FROM (
        SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
          FROM myTable
         UNION ALL
        SELECT idnew, ROW_NUMBER() OVER (ORDER BY idnew) + 
               (SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
          FROM myTable
         WHERE idnew IS NOT NULL
        ) a
  ORDER BY RowNumber

Я предполагаю, что столбец id НЕ поддерживает NULL.

ПРИМЕЧАНИЕ. Если вы хотите сохранить значения NULL из столбца idnewИ поддержите порядок, затем удалите предложение WHERE и идентификатор ORDER BY во втором выборе:

 SELECT id
   FROM (
        SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
          FROM myTable
         UNION ALL
        SELECT idnew, ROW_NUMBER() OVER (ORDER BY id) + 
               (SELECT COUNT(*) FROM dbo.myTable) AS RowNumber
          FROM myTable
        ) a
  ORDER BY RowNumber
...