sql If 语句或案例

sql If statement or case

我想我可能遗漏了这里显而易见的内容,但我正在尝试创建一个 sql 查询以以特定方式提取数据,但无法解决。

我有一个 table,它由以下列组成:

Name, StageDate, Stage

我想在 sql 中创建这样的输出:

Name, Stage, Stage1Date, Stage2Date, Stage3Date

Person1, 1, 01/01/2015, NULL, NULL

Person1, 2, 01/01/2015, 02/01/2015, NULL

Person1, 3, 01/01/2015, 02/01/2015, 03/01/2015

目前我的查询如下:

select Name
        , Stage
        , Case when Stage = 1 then StageDate end as Stage1Date
        , Case when Stage = 2 then StageDate end as Stage2Date
        , Case when Stage = 3 then StageDate end as Stage3Date
From Details

上述查询的数据导出目前如下所示:

Name, Stage, Stage1Date, Stage2Date, Stage3Date

Person1, 1, 01/01/2015, NULL, NULL

Person1, 2, NULL, 02/01/2015, NULL

Person1, 3, NULL, NULL, 03/01/2015

试试这个

select Name
        , Stage
        , StageDate as Stage1Date
        , Case when (Stage = 2 OR Stage = 3) then StageDate else null end as Stage2Date
        , Case when Stage = 3 then StageDate else null end as Stage3Date
From Details

我现在唯一能想到的是使用 UNIONS 作为使用子查询的其他答案的替代方法:

SELECT Name, 
       stage, 
       stagedate AS Stage1Date, 
       NULL      AS Stage2Date, 
       NULL      AS Stage3Date 
FROM   details 
WHERE  stage = 1 
UNION 
SELECT d1.Name, 
       d1.stage, 
       d1.stagedate AS Stage1Date, 
       d2.stagedate AS Stage2Date, 
       NULL         AS Stage3Date 
FROM   details d1 
       INNER JOIN details d2 ON d1.NAME = d2.NAME 
                  AND d1.stage = 1 AND d2.stage = 2 
UNION 
SELECT d1.Name, 
       d1.stage, 
       d1.stagedate AS Stage1Date, 
       d2.stagedate AS Stage2Date, 
       d3.stagedate AS Stage3Date 
FROM   details d1 
       INNER JOIN details d2 ON d1.NAME = d2.NAME 
                  AND d1.stage = 1 AND d2.stage = 2 
       INNER JOIN details d3 ON d1.NAME = d3.NAME 
                  AND d1.stage = 1 AND d3.stage = 3 

试试这个:

DECLARE @Stages TABLE (
      Name varchar(20), 
      Stage int, 
      StageDate datetime);

INSERT INTO @Stages (Name, Stage, StageDate)
VALUES
    ('Player 1', 1, '2015-04-01'),
    ('Player 1', 2, '2015-05-01'),
    ('Player 1', 3, '2015-06-01'),
    ('Player 2', 1, '2015-04-01'),
    ('Player 2', 2, '2015-05-01');

SELECT NAME, Stage, 
        CASE WHEN Stage >=1 THEN (SELECT s2.StageDate FROM @Stages s2 Where s2.Name = s1.Name and s2.Stage =1)  Else NULL END As Stage1Date,
        CASE WHEN Stage >=2 THEN (SELECT s2.StageDate FROM @Stages s2 Where s2.Name = s1.Name and s2.Stage =2)  Else NULL END As Stage2Date,
        CASE WHEN Stage >=3 THEN (SELECT s2.StageDate FROM @Stages s2 Where s2.Name = s1.Name and s2.Stage =3)  Else NULL END As Stage3Date
 FROM @Stages s1