(Select top 1 pvd.Code from PatientVisitDiags pvd
where pvd.PatientVisitId = pv.PatientVisitId
Order By pvd.Listorder) as "DX1",
(Select top 1 a.code from (Select top 2 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
where pvd.PatientVisitId = pv.PatientVisitId
Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX2",
(Select top 1 a.code from (Select top 3 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
where pvd.PatientVisitId = pv.PatientVisitId
Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX3",
(Select top 1 a.code from (Select top 4 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
where pvd.PatientVisitId = pv.PatientVisitId
Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX4",
(Select top 1 a.code from (Select top 5 pvd.Code,pvd.ListOrder from PatientVisitDiags pvd
where pvd.PatientVisitId = pv.PatientVisitId
Order By pvd.Listorder)a order by a.ListOrder DESC ) as "DX5"
以上代码是我目前正在使用的代码(它不是最佳代码,但仅用于一次数据导出)。
在我们当前导出的数据库中,有一个表PatientVisitDiags,其中包含“ListOrder”和“Code”列。可以有1到5个代码。 ListOrder保存该代码的编号。例如:
ListOrder|Code |
1 |M51.27 |
2 |M54.17 |
3 |G83.4 |
我正在尝试将代码导出到新表中的相应列(DX1,DX2..etc)。如果我按ListOrder排序,我可以按照我需要的顺序得到它们(第1行到DX1 |第2行到DX2等)但是当我运行上面的SQL代码时,如果源表只有3个代码,DX4和DX5会重复DX3 。例如:
DX1 |DX2 |DX3 |DX4 |DX5
M51.27 |M54.17 |G83.4 |G83.4 |G83.4
如果选择TOP超过给定的值,有没有办法让TOP返回NULL值? SQL Sever 2008不允许使用OFFSET / FETCH,这是我通常在选择单个行时可以做的事情。
TL:DR
ID | Name
1 | Joe
2 | Eric
3 | Steve
4 | John
如果我有一张上面的表并运行
SELECT TOP 5 Name FROM Table
无论如何要回来?
Joe
Eric
Steve
John
NULL
答案 0 :(得分:2)
你真正在做的是转动。枢纽!试试这个小问题:
WITH Top5 AS (
SELECT TOP 5
Dx = 'DX' + Convert(varchar(11), Row_Number() OVER (ORDER BY pvd.Listorder)),
pvd.Code
FROM dbo.PatientVisitDiags pvd
WHERE pvd.PatientVisitId = @patientVisitId
)
SELECT *
FROM
Top5 t
PIVOT (Max(Code) FOR Dx IN (DX1, DX2, DX3, DX4, DX5)) p
;
要回答关于获取一个不透明的行集的第二个问题,基本上做同样的事情,但以某种方式提供5行并保持连接到所需的数据。
WITH Data AS (
SELECT TOP 5
Seq = Row_Number() OVER(ORDER BY ID),
Name
FROM dbo.Table
ORDER BY ID
)
SELECT
n.Seq,
t.Name
FROM
(VALUES
(1), (2), (3), (4), (5) -- or a numbers-generating CTE perhaps
) n (Seq)
LEFT JOIN Top 5 t
ON n.Seq = t.Seq
;
旁注
你这样做的事实:
where pvd.PatientVisitId = pv.PatientVisitId
告诉我你没有使用ANSI连接。停止。不要那样做了。将此连接条件放在ON
的{{1}}子句中。这是2016年...为什么你使用上个世纪的连接语法?
哦,并在表名称上添加模式前缀。查找 - 你会发现为什么要这样做的实际性能原因。这不仅仅是找到正确的架构所花费的时间,还有关于执行计划缓存......
答案 1 :(得分:0)
一次一个 - 回答最后一个问题
使用一堆null
创建一个表return prime_factors;