首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL SERVER中编写此SQL语句?

如何在SQL SERVER中编写此SQL语句?
EN

Stack Overflow用户
提问于 2018-02-06 14:26:21
回答 2查看 103关注 0票数 0

我有两张桌子:

代码语言:javascript
复制
CREATE TABLE [dbo].[LabTests](
    [TestId] [int] IDENTITY(1,1) NOT NULL,
    [TestName] [nvarchar](50) NULL)


CREATE TABLE [dbo].[TestsRanges](
    [TestId] [int] NULL,
    [CatId] [int] NULL,
    [PatientSex] [int] NULL,
    [CaseId] [int] NULL,
    [LowerLimit] [nvarchar](15) NULL,
    [UpperLimit] [nvarchar](15) NULL,

每个实验室测试都有参考范围、低范围(lowerLimit)和高范围(UpperLimit)。此外,每个测试可能有不止一个范围,这取决于患者的男性或女性和患者的年龄。现在,我的select语句显示了以下输出:

代码语言:javascript
复制
select a.TestId , a.TestName , b.LowerLimit , b.UpperLimit
from LabTests  a, TestsRanges b
where a.TestId = b.TestId
order by a.TestId 

1   White Blood Cell Count  1   10
1   White Blood Cell Count  3   8
1   White Blood Cell Count  12  20
2   Red Blood Cell Count    1   20
2   Red Blood Cell Count    1   3
3   Hemoglobin Concentration    5   9
5   Mean Cell Volume    2   4.5
5   Mean Cell Volume    3   6
6   ALBUMIN         
9   FREE - T3   1   10
9   FREE - T3   3   7
10  FREE-T4 2.5 5.6
10  FREE-T4 2   4.3

但是我不需要这个模棱两可的测试名称,我只需要输出像这样显示一次测试名称:

代码语言:javascript
复制
1   White Blood Cell Count  1   10
                            3   8
                            12  20

2   Red Blood Cell Count    1   20
                            1   3

3   Hemoglobin Concentration    5   9

5   Mean Cell Volume    2   4.5
                        3   6

9   FREE - T3   1   10
                3   7

10  FREE-T4 2.5 5.6
            2   4.3
EN

回答 2

Stack Overflow用户

发布于 2018-02-06 14:33:53

正如我在上面提到的,你可以检查共享链接,但我在下面发布了答案,它可能对你有用,我还没有测试过。

代码语言:javascript
复制
DECLARE @tblLabTests AS Table
(
    TestId INT,
    TestName VARCHAR(50)
)

DECLARE @tblTestsRanges AS Table
(       
    TestId INT,
    LowerLimit INT,
    UpperLimit INT
)

INSERT INTO @tblLabTests VALUES(1,'White Blood Cell Count')
INSERT INTO @tblLabTests VALUES(2,'Red Blood Cell Count')
INSERT INTO @tblLabTests VALUES(3,'Hemoglobin Concentration')
INSERT INTO @tblLabTests VALUES(5,'Mean Cell Volume')   

INSERT INTO @tblTestsRanges VALUES(1,1,10)
INSERT INTO @tblTestsRanges VALUES(1,11,20)
INSERT INTO @tblTestsRanges VALUES(2,15,20)
INSERT INTO @tblTestsRanges VALUES(2,6,9)

select 
    CASE WHEN a.TestId = lag(a.TestId)  OVER (ORDER BY a.TestId) THEN '' ELSE CAST(a.TestId AS VARCHAR(50)) END TestId ,       
    CASE WHEN a.TestName = lag(a.TestName)  OVER (ORDER BY a.TestName) THEN '' ELSE CAST(a.TestName AS VARCHAR(50)) END TestName,
    b.LowerLimit , 
    b.UpperLimit
from @tblLabTests  a, @tblTestsRanges b
where a.TestId = b.TestId
order by a.TestId

输出:

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 14:38:12

尝试一下,它只使用了ROW_NUMBER()窗口函数,相当基本的查询:)

代码语言:javascript
复制
select case when RN = 1 then TestName else '' end,
       LowerLimit , UpperLimit
from (
select a.TestId [TestId],
       a.TestName [TestName],
       b.LowerLimit [LowerLimit],
       b.UpperLimit [UpperLimit],
       row_number() over (order by b.LowerLimit partition by a.TestId , a.TestName) [RN]
from LabTests  a, TestsRanges b
where a.TestId = b.TestId
) c
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48636739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档