使用SQL Server 2000
表1
ID
A001
A002
A003
A004
A005
A006
A007
....
....
A028
从上表中,我想将3行拆分为3列,按id
行显示如下
预期产出
id1 id2 id3
A001 A002 A003
A004 A005 A006
A007 A008 A009
...
...
A025 A026 A027
A028 null null
ID不是固定的,ID也可能包含这样的内容(01A or A001 or 1A1 or etc....
)
表1行数不固定,也可能超过100行。第3列是固定的。如何查询上述条件。
需要查询帮助
答案 0 :(得分:2)
我会这样做:
A
替换为这些ID中的任何内容并将其转换为整数SELECT
语句,其中条件将是上面步骤%3中计算的整数ID,分别为1,2,0,以产生每行中的记录。ROW_NUMBER()
本来就很方便,但是因为你在SQL Server 2000上,你会使用{{ 1}}为这些SELECT语句中的每一行生成行号,并为此值生成JOIN。但由于IDENTITY(INT, 1, 1)
只能在IDENTITY
中使用SELECT
子句,因此您最终会得到包含每列的临时表并加入它们。
INTO
如果您使用的是SQL Server 2005或更高版本,则可以在单个查询中完成所有这些操作,如下所示:
SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row1 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 1
SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row2 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 2
SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row3 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 0
SELECT
r1.ID id1,
r2.ID id2,
r3.ID id3
FROM
#Row1 r1
FULL OUTER JOIN #Row2 r2
ON r1.RowNum = r2.RowNum
FULL OUTER JOIN #Row3 r3
ON r3.RowNum = r3.RowNum
DROP TABLE #Row1
DROP TABLE #Row2
DROP TABLE #Row3