SQL Server - 在案例陈述中设置多个值?

时间:2010-07-15 09:22:17

标签: sql sql-server select case

我有一个SQL Select语句,我需要根据条件返回某些值。我每次都需要返回多个值,但是我对Case语句的理解是你只能为每个case返回一个值。

我现在通过使用UNION语句来解决这个问题,但这看起来有点麻烦 - 有更好的方法吗?基本上,我有一堆提示,每个提示都有“是”,“否”或“未来”的响应(我实际上有更多的回复,但我只会使用3作为示例来保持简短!) - 我需要为每个响应类型生成一个列,其中1表示相应响应的值,0表示所有其他响应类型。如果你看一下SQL,可能会更清楚......

我的(简化)查询如下所示:

SELECT branch,
       promptType,
       response,
       1 AS 'Yes',
       0 AS 'No',
       0 AS 'Not Discussed'
FROM prompts
WHERE response = 'Y'

UNION

SELECT branch,
       promptType,
       response,
       0 AS 'Yes',
       1 AS 'No',
       0 AS 'Not Discussed'
FROM prompts
WHERE response = 'N'

UNION

SELECT branch,
       promptType,
       response,
       0 AS 'Yes',
       0 AS 'No',
       1 AS 'Not Discussed'
FROM prompts
WHERE response = 'D'

5 个答案:

答案 0 :(得分:4)

像...一样的东西。

SELECT branch,
       prompttype,
       CASE WHEN response = 'Y' THEN 'Yes'
            WHEN response = 'N' THEN 'No'
            WHEN response = 'D' THEN 'Not Discussed'
    FROM prompts;

可能就是你想要的。

在您的评论之后,或许......

SELECT branch,
       prompttype,
       CASE WHEN response = 'Y' THEN 1 ELSE 0 AS Yes,
       CASE WHEN response = 'N' THEN 1 ELSE 0 AS No,
       CASE WHEN response = 'D' THEN 1 ELSE 0 AS Not_Discussed
    FROM prompts;

可能会这样做。

答案 1 :(得分:3)

您是否考虑过为响应创建解码表并加入到该?

例如,这将创建一个用于解码响应的表:

CREATE TABLE decoder (response CHAR(1), [Yes] BIT, [No] BIT, [Not Discussed] BIT)
INSERT INTO decoder VALUES ('Y', 1, 0, 0)
INSERT INTO decoder VALUES ('N', 0, 1, 0)
INSERT INTO decoder VALUES ('D', 0, 0, 1)

...然后您可以加入它以获得与您的UNION相似的(相同的?)结果:

SELECT
    prompts.branch,
    prompts.prompttype,
    prompts.response,
    decoder.yes,
    decoder.no,
    decoder.[Not Discussed]
FROM 
    prompts INNER JOIN decoder ON prompts.response = decoder.response

可能是值得考虑的方法;它是一个比你的联盟更具关系性的解决方案,而且可能更容易维护。

答案 2 :(得分:1)

我认为你需要添加分组。我用季度预测做了这个。如果你有一个唯一的ID用于每个响应,它将是这样的(否则它将选择整个分支/提示类型/响应的最大值):

SELECT uniqueID,
   branch,
   prompttype,
   response,
   MAX(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) AS Yes,
   MAX(CASE WHEN response = 'N' THEN 1 ELSE 0 END) AS [No],
   MAX(CASE WHEN response = 'D' THEN 1 ELSE 0 END) AS  Not_Discussed
FROM prompts

GROUP BY uniqueID,
    branch,
    prompttype,
    response;

答案 3 :(得分:0)

SELECT branch,
       prompttype,
    response,
       CASE WHEN response = 'Y' THEN 1 ELSE 0 END AS Yes,
       CASE WHEN response = 'N' THEN 1 ELSE 0 END AS [No],
       CASE WHEN response = 'D' THEN 1 ELSE 0 END AS  Not_Discussed
    FROM prompts;

答案 4 :(得分:0)

如果您提出的CASE语句在单个列中返回多个值,那么数据类型是什么:数组,列表,表,XML文档,业务对象等?对于真正的关系数据库管理系统(TRDBMS),答案是关系变量。但我们在这里谈论SQL Server。

我认为你要找的答案是SQL Server的数据类型是标量的,而不是多值的。