我是一位长期的SAS程序员,我们正在考虑将我们的系统从SAS迁移到另一个平台。我只是非常基本的SQL知识,营销人员谈论使用SQL很多,但我想知道它可能会做一些我们需要做的事情。例如,我们为每位给予患者的疫苗提供了多达5000万行疫苗接种记录的文件。一些疫苗实际上是代表2-4种不同类型疫苗的组合疫苗。疫苗的类型基于CVX的价值。使用do-loop在SAS中执行此操作非常简单,但我不知道如何在SQL中完成此操作。可以安全地假设我们在表中包含需要生成1到4种疫苗类型的所有CVX代码。但是你会如何在SQL中做到这一点?
谢谢,
史蒂夫答案 0 :(得分:0)
我对您的架构一无所知,但听起来您希望将多个列拆分成行。您可以使用CROSS APPLY
或UNPIVOT
运算符。下面是一个示例,它采用一个人为的测试表,并将每个键分成不同的行:
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