SQL - 从单行创建多个行

时间:2014-03-14 18:25:01

标签: sql records

我是一位长期的SAS程序员,我们正在考虑将我们的系统从SAS迁移到另一个平台。我只是非常基本的SQL知识,营销人员谈论使用SQL很多,但我想知道它可能会做一些我们需要做的事情。例如,我们为每位给予患者的疫苗提供了多达5000万行疫苗接种记录的文件。一些疫苗实际上是代表2-4种不同类型疫苗的组合疫苗。疫苗的类型基于CVX的价值。使用do-loop在SAS中执行此操作非常简单,但我不知道如何在SQL中完成此操作。可以安全地假设我们在表中包含需要生成1到4种疫苗类型的所有CVX代码。但是你会如何在SQL中做到这一点?

谢谢,

史蒂夫

1 个答案:

答案 0 :(得分:0)

我对您的架构一无所知,但听起来您希望将多个列拆分成行。您可以使用CROSS APPLYUNPIVOT运算符。下面是一个示例,它采用一个人为的测试表,并将每个键分成不同的行:

create table #Test
(
    Test_Key int identity(1,1) primary key clustered,
    Test_A int,
    Test_B int,
    Test_C int
)

declare @n int
set @n = 1
while @n < 10000
begin
    insert into #Test (Test_A, Test_B, Test_C)
    select @n * 5 + 1, @n * 5 + 2, @n * 5 + 3
    set @n = @n + 1
end

select * from #Test

-- this example converts the columns into rows using CROSS APPLY
-- this may be slightly less expensive than the UNPIVOT example below
select
    F_Key,
    F_Value
from #Test
cross apply
(
    values
        (Test_Key, Test_A), -- 1st row is Test_A
        (Test_Key, Test_B), -- 2nd row is Test_B
        (Test_Key, Test_C)  -- 3rd row is Test_C
) as F(F_Key, F_Value)

-- this example converts the columns into rows using the UNPIVOT operator
select
    Test_Key, TestKey
from #Test
unpivot
    (TestKey for Test_Type in (Test_A, Test_B, Test_C)) as C

drop table #Test