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
我想我可能遗漏了这里显而易见的内容,但我正在尝试创建一个 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