SQL Server 2008是否可以选择返回顶部空值

时间:2016-06-13 21:15:23

标签: sql-server sql-server-2008

(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

2 个答案:

答案 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;