У меня есть следующие данные
COL-1 COL-2
1 0TY/OK
1 0TY/OK
1 0TY/OK
1 0TY/OK
1 0TY/OK
2 2KP/L
2 2KP/L
2 2KP/L
2 2KP/L
2 2KP/L
3 7U5/2M
3 7U5/2M
3 7U5/2M
3 7U5/2M
И я хочу создать запрос Select для получения тех данных в выводе ниже
COL-1 COL-2 COL-3
1 0TY/OK 0TY/OK
1 0TY/OK 2KP/L
1 0TY/OK 7U5/2M
1 0TY/OK
1 0TY/OK
2 2KP/L
2 2KP/L
2 2KP/L
2 2KP/L
2 2KP/L
3 7U5/2M
3 7U5/2M
3 7U5/2M
3 7U5/2M
Я хочу, чтобы COL3 возвратил отличные значения COL2
Используя SELECT COL1, COL2, DISTINCT COL2 AS COL3 FROM MYTable
не работает SQL-СЕРВЕР
Хотя я уверен, что какой-нибудь мастер SQL сможет сконструировать способ сделать это, я чувствую необходимость указать, что концептуально это не имеет смысла - значения в строках столбца 3 совершенно не связаны к значениям строк в столбцах 1 и 2.
Разве нельзя просто вернуть отдельные значения COL2 в отдельном запросе?
SELECT DISTINCT COL2 FROM MyTable
(Обратите внимание, что вы можете вернуть несколько наборов результатов из одного запроса SQL)
Это действительно необычно, и я не могу понять, зачем вам это нужно в одном наборе результатов, поскольку это не имеет никакого смысла... Нет никакой причины связывать строки отдельного запроса со строками не отдельного запроса, но что вам нужно сделать, так это просто запустить оба запроса
Select Col1, Col2 From Table
Order By Col1, Col2
и
Select Distinct Col2 From Table
и объединить их вместе (Чтобы объединить их по номеру строки, добавьте функцию Row_Number() к каждому запросу:
Select Col1, Col2, Col3
From (Select Row_Number() Over(Order By Col1, Col2)RowNum,
Col1, Col2
From Table) T1
Left Join
(Select Distinct Col2 As Col3,
(Select Count(Distinct Col2)
From Table
Where Col2 <= T2.Col3) RowNum
From Table) T2
On T2.RowNum = T1.RowNum
Попробуйте это ..
WITH MyTable AS
(
SELECT 1 Col1,CONVERT (VarChar (25), '0TY/OK') Col2 UNION ALL
SELECT 1,'0TY/OK' UNION ALL
SELECT 1,'0TY/OK' UNION ALL
SELECT 1,'0TY/OK' UNION ALL
SELECT 1,'0TY/OK' UNION ALL
SELECT 2,'2KP/L' UNION ALL
SELECT 2,'2KP/L' UNION ALL
SELECT 2,'2KP/L' UNION ALL
SELECT 2,'2KP/L' UNION ALL
SELECT 2,'2KP/L' UNION ALL
SELECT 3,'7U5/2M' UNION ALL
SELECT 3,'7U5/2M' UNION ALL
SELECT 3,'7U5/2M' UNION ALL
SELECT 3,'7U5/2M'
)
,
AllData AS
(
SELECT
*,
ROW_NUMBER () OVER (ORDER BY Col2) as Id
FROM MyTable
)
,
DistinctData AS
(
SELECT
Distinct Col2 AS Col3
FROM MyTable
),
DistinctWithRowNumber AS
(
SELECT
*,
ROW_NUMBER () OVER (ORDER BY Col3) as Id
FROM DistinctData
)
SELECT
Col1,
Col2,
Col3
FROM AllData
LEFT JOIN DistinctWithRowNumber
ON AllData.Id = DistinctWithRowNumber.Id
возвращает этот результат
Col1 Col2 Col3
----------- ------------------------- -------------------------
1 0TY/OK 0TY/OK
1 0TY/OK 2KP/L
1 0TY/OK 7U5/2M
1 0TY/OK NULL
1 0TY/OK NULL
2 2KP/L NULL
2 2KP/L NULL
2 2KP/L NULL
2 2KP/L NULL
2 2KP/L NULL
3 7U5/2M NULL
3 7U5/2M NULL
3 7U5/2M NULL
3 7U5/2M NULL
Вы можете использовать CTE для создания ROW_NUMBER и JOIN над этими виртуальными столбцами.
DECLARE @t TABLE (
Col1 INT
,Col2 VARCHAR(10)
);
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (1, '0TY/OK');
INSERT INTO @t VALUES (2, '2KP/L,');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (2, '2KP/L');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');
INSERT INTO @t VALUES (3, '7U5/2M');
; WITH all_data AS (
SELECT
Col1
,Col2
,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
FROM @t
),
distinct_data AS (
SELECT
Col2
,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum
FROM @t
GROUP BY
Col2
)
SELECT
all_data.Col1
,all_data.Col2
,distinct_data.Col2
FROM all_data
LEFT JOIN distinct_data ON all_data.RowNum = distinct_data.RowNum