我有两张桌子:
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语句显示了以下输出:
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但是我不需要这个模棱两可的测试名称,我只需要输出像这样显示一次测试名称:
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发布于 2018-02-06 14:33:53
正如我在上面提到的,你可以检查共享链接,但我在下面发布了答案,它可能对你有用,我还没有测试过。
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输出:

发布于 2018-02-06 14:38:12
尝试一下,它只使用了ROW_NUMBER()窗口函数,相当基本的查询:)
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
) chttps://stackoverflow.com/questions/48636739
复制相似问题