SQL 服务器案例陈述

SQL Server Case Statements

我正在尝试编写一个只为每个 employerid 生成一行的查询,而不是为每个雇主生成多行并且一次只填充其中一列。我的查询得到以下信息:

我正在使用的查询是这样的:

SELECT Employer.employerid,
    CASE WHEN Service.xxserviceid = '1' THEN 'Number 1' ELSE 'NULL' END AS Service1,
    CASE WHEN Service.xxserviceid  = '2' THEN 'Number 2' ELSE 'NULL' END AS Service2,
    CASE WHEN Service.xxserviceid  = '3' THEN 'Number 2' ELSE 'NULL' END AS Service3
FROM Employer
INNER JOIN Service
ON Service.employerid = Employer.employerid;

所以我希望每个雇主在一行中填写 Service1Service2Service3 列,而不是每个雇主填写多行。

您可以使用 GROUP BY + MAX 将每个员工的结果减少到一行:

SELECT Employer.employerid,
  max(CASE WHEN Service.xxserviceid = '1' THEN 'Number 1' ELSE 'NULL' END) AS Service1,
  max(CASE WHEN Service.xxserviceid  = '2' THEN 'Number 2' ELSE 'NULL' END) AS Service2,
  max(CASE WHEN Service.xxserviceid  = '3' THEN 'Number 3' ELSE 'NULL' END) AS Service3
FROM Employer
INNER JOIN Service
  ON Service.employerid = Employer.employerid
GROUP BY Employer.employerid;

不过,如果您考虑一下,您甚至不需要与 Employer table 的连接,因为您从中使用的只是 employerid 列,它Service.

中已经存在

因此,查询可以简化为:

SELECT employerid,
  max(CASE WHEN xxserviceid = '1' THEN 'Number 1' ELSE 'NULL' END) AS Service1,
  max(CASE WHEN xxserviceid  = '2' THEN 'Number 2' ELSE 'NULL' END) AS Service2,
  max(CASE WHEN xxserviceid  = '3' THEN 'Number 3' ELSE 'NULL' END) AS Service3
FROM Service
GROUP BY employerid;

SQLFiddle:http://www.sqlfiddle.com/#!6/004a9/2

SELECT Employer.employerid,
    MAX(CASE WHEN Service.xxserviceid = '1' THEN 'Number 1' ELSE 'NULL' END) AS Service1,
    MAX(CASE WHEN Service.xxserviceid  = '2' THEN 'Number 2' ELSE 'NULL' END) AS Service2,
    MAX(CASE WHEN Service.xxserviceid  = '3' THEN 'Number 2' ELSE 'NULL' END) AS Service3
FROM Employer
INNER JOIN Service
ON Service.employerid = Employer.employerid;
GROUP BY Employer.employerID

据我了解你的问题,你可能只需要一个服务栏。 此 post 中提供的其他答案应该有效。如果您只需要一个服务栏,您可以尝试以下操作:

SELECT Employer.employerid,
    'Number ' + Max(Service.xxserviceid) AS Service1
FROM Employer
INNER JOIN Service
ON Service.employerid = Employer.employerid;
GROUP BY Employer.employerid