在编写复杂的SQL查询时需要帮助

时间:2013-02-03 19:28:11

标签: sql-server

CREATE TABLE #tmpTableA
(
    [Id] [int] NOT NULL,
    RegionId INT,
    DistrictId INT,
    NurseryDays INT,
    TransplantDays INT     
 )

INSERT #tmpTableA ([Id], RegionId,DistrictId,NurseryDays,TransplantDays) VALUES (1,1,NULL,2,2) 
INSERT #tmpTableA ([Id], RegionId,DistrictId,NurseryDays,TransplantDays) VALUES (2,1,2,NULL,2) 

示例代码的输出是,

Id  RegionId    DistrictId     NurseryDays         TransplantDays
2     1            2               NULL              2
1     1            NULL             2                2

我想要的结果是, 1.)如果RegionId和DistrictId存在,则获得此组合的移植天数,否则获得RegionId和DistrictId的移植天数(NULL)。

2。)如果RegionId和DistrictId存在,那么获得这个组合的托儿所天数,否则获得RegionId和DistrictId(NULL)的托儿所天数。

期望的结果:

NurseryDays        TransplantDays
 2                      2

这可以在单个查询中使用吗?

谢谢&问候, 费萨尔纳西尔

2 个答案:

答案 0 :(得分:0)

结果说明与实际结果不符。如果您需要regionid的托儿所天数并从您的数据中删除,则该值应为空。

您需要创建一个存储过程,如图所示,以获得结果。

create PROCEDURE ProcGetDays 
    @regionid int
AS
BEGIN

    SET NOCOUNT ON;
declare @nurserydays int
declare @transplantdays int

select @transplantdays = transplantdays from tmpTableA where regionid=@regionid and districtid is not null
if @transplantdays is null
    select @transplantdays = transplantdays from tmpTableA where regionid=@regionid

select @nurserydays=nurserydays from tmpTableA where regionid=@regionid and districtid is not null
if @nurserydays is null
    select @nurserydays=nurserydays from tmpTableA where regionid=@regionid

select @nurserydays as nurserydays,@transplantdays as transplantdays


END
GO

如果您需要使用临时表,则需要在存储过程中创建它以使其仍然可用。在样本中我使用了永久表。

END GO

答案 1 :(得分:0)

首先,使用过滤器检索具有特定RegionId和特定或NULL DistrictId的行。然后对行进行排序,使更具体的行在另一行之前,并选择最顶行。

在SQL中,它可能如下所示:

SELECT TOP 1
  NurseryDays,
  TransplantDays
FROM YourTable
WHERE RegionId = @RegionId
  AND (DistrictId = @DistrictId OR @DistrictId IS NULL)
ORDER BY
  CASE DistrictId
    WHEN @DistrictId THEN 0
    ELSE 1
  END
;