3

我在 SQL Sever 中有单列数据,需要将其扩展为多 (2) 列。

原始数据如下所示:

Col1
-------
Monday
Jon
Boris
Natalie
Tuesday
James
Tom
Boris

我希望它看起来像这样:

Name   | Day
-------+---------
Jon    | Monday
Boris  | Monday
Natalie| Monday
James  | Tuesday
Tom    | Tuesday
Boris  | Tuesday

提前谢谢了。

4

2 回答 2

4

假设您将能够将该标识列添加到源表以进行排序,并且您的表将如下所示:

CREATE TABLE Table1 (id int identity(1,1), Col1 NVARCHAR(50))

INSERT INTO Table1 (Col1)
VALUES 
    ('Monday'),('Jon'),('Boris'),('Natalie'),
    ('Tuesday'),('James'),('Tom'),('Boris')

您可以尝试以下方法:

  • 首先为工作日创建一个临时表,以便您可以区分它们(也可以通过其他方式完成)
  • 加入几天前的原始表以寻找更大的 ID (t.ID > d1.ID)
  • 防止那些应该在第二天进入的 ID (t.ID < MIN(d2.Id))
  • Coalesce 只是为了确保它在列表中的最后一天有效。

.

CREATE TABLE #weekDays (wd NVARCHAR(10));

INSERT INTO #weekDays
VALUES 
    ('Monday'), ('Tuesday'), ('Wednesday'), 
    ('Thursday'), ('Friday'), ('Saturday'), ('Sunday');

WITH CTE_Days AS
(
    SELECT t.*
    FROM Table1 t
    INNER JOIN #weekDays wd ON wd.wd = t.col1
)
SELECT *
FROM CTE_Days d1
INNER JOIN Table1 t ON t.id > d1.id AND t.id < 
    COALESCE((
        SELECT MIN(d2.id)
        FROM CTE_Days d2
        WHERE d2.id > d1.id
    ), t.id + 1)
于 2013-06-21T11:45:23.083 回答
2

试试这个——

询问:

DECLARE @temp TABLE (Col1 NVARCHAR(50))

INSERT INTO @temp (Col1)
VALUES 
    ('Monday'),('Jon'),('Boris'),('Natalie'),
    ('Tuesday'),('James'),('Tom'),('Boris')

;WITH cte AS 
(
    SELECT 
          Col1
        , rn = ROW_NUMBER() OVER (ORDER BY 1/0) % 4
        , rn2 = ROW_NUMBER() OVER (ORDER BY 1/0)
    FROM @temp
)
SELECT 
      [Day] = t.Col1
    , Name = t2.Col1 
FROM cte t
OUTER APPLY (
    SELECT *
    FROM cte t2
    WHERE t2.rn2 BETWEEN t.rn2 + 1 AND t.rn2 + 3
) t2
WHERE t.rn = 1

输出:

输出

于 2013-06-21T10:29:25.173 回答