我有以下数据
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 SERVER
答案 0 :(得分:1)
虽然我确信某些SQL向导能够构建一种方法来执行此操作,但我觉得需要指出概念上这没有意义 - 第3列的行中的值完全不相关到第1列和第2列中的行值。
您是否可以在单独的查询中简单地返回COL2的不同值?
SELECT DISTINCT COL2 FROM MyTable
(请注意,您可以从单个SQL查询返回多个结果集)
答案 1 :(得分:1)
这是非常不寻常的,我无法理解为什么你想在一个结果集中使用它,因为它没有任何意义......没有理由将不同查询的行与非结果中的行相关联-distinct query。,但你要做的只是运行两个查询
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
答案 2 :(得分:0)
您可以使用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
答案 3 :(得分:0)
试试这个..
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