SQL,Case When Then As [英] sql, case when then as
本文介绍了SQL,Case When Then As的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在Web和Stackoverflow上进行了多次搜索后,仍然在寻找一种使用别名返回列而不生成新行/行的方法。
以下工作创建了列"Sig_1_emp"和"Sig_3_Staff",但Sig_1_emp和Sig_3_Staff的数据不在同一行,而是两行。
CASE
WHEN VisitSignatures.order = 1 THEN Employees.last_name
END AS Sig_1_Emp,
CASE
WHEN VisitSignatures.order = 3 THEN Employees.last_name
END AS Sig_3_Staff
那么,像下面这样的东西会起作用吗?
CASE WHEN VisitSignatures.order = 1 THEN Employees.last_name AS Sig_1_Emp
WHEN VisitSignatures.order = 3 THEN Employees.last_name AS Sig_3_Staff
END
以下是完整的查询:
Select
CV.clientvisit_id,
CV.program_id,
CV.visittype,
CV.non_billable,
CV.rev_timein,
CASE
WHEN CVSig.ord = 1 THEN Employees.last_name
ELSE Null
END AS Sig_1_Emp,
CASE
WHEN CVSig.ord = 3 THEN Employees.last_name
ELSE Null
END AS Sig_3_Staff
From CV
Inner Join CVSig On CV.clientvisit_id = CVSig.clientvisit_id
Inner Join EmpSig On CVSig.employeesignature_id = EmpSig.employeesignature_id
Inner Join Employees On EmpSig.emp_id = Employees.emp_id
Where
CV.program_id In (121, 123)
And CV.rev_timein >= @param1
And CV.rev_timein <= DATEADD(d, 1, @param2)
和结果样本:
+----------------+------------+-----------+------------+-----------+-------------+
| clientvisit_id | program_id | visittype | rev_timein | sig_1_emp | sig_3_staff |
+----------------+------------+-----------+------------+-----------+-------------+
| 1001 | 121 | M_Mgmnt | 7/1/2014 | | Nurse_Pat |
| 1001 | 121 | M_Mgmnt | 7/1/2014 | Doc_Sue | |
+----------------+------------+-----------+------------+-----------+-------------+
这就是我希望得到的:
+----------------+------------+-----------+------------+-----------+-------------+
| clientvisit_id | program_id | visittype | rev_timein | sig_1_emp | sig_3_staff |
+----------------+------------+-----------+------------+-----------+-------------+
| 1001 | 121 | M_Mgmnt | 7/1/2014 | Doc_Sue | Nurse_Pat |
+----------------+------------+-----------+------------+-----------+-------------+
给您带来的不便表示歉意,感谢您的耐心等待。 如果这不能澄清我的问题,请删除此帖子。
推荐答案
鉴于您对问题的更新,很明显您缺少的是具有适当聚合函数的GROUP BY
子句。
clientvisit_id
、program_id
、visittype
、rev_timein
)在两个样本行中包含相同的值。如果GROUP BY
这四列,则样例行将被分组为一行,因为它们的值相同。我不知道为什么您不在这里显示non_billable
,但是这个概念扩展到您想用来定义不同组的所有列。
由于sig_1_emp
和sig_3_staff
列不用于分组,因此它们必须与one of the available aggregate functions一起使用,而不是与列列表中的"Naked"一起使用。在这种情况下,典型的做法是使用MIN()
或MAX()
,这两种方法都忽略NULL
行,只返回许多值中的一个。当组中的所有值都相等时,它们是相等的,否则它们会给出最小值或最大值。
如果您不确定所有非NULL
行都具有相同的值,则必须根据GROUP BY
子句中未出现的行,找出选择或派生值的其他方法,或者随意接受比较的值作为最大值或最小值。请记住,每种数据类型可能都有其自己的比较规则。似乎是不可取的。
因此,请尝试将此内容添加到查询的末尾:
GROUP BY clientvisit_id, program_id, visittype, rev_timein, non_billable
并按如下方式包装CASE
表达式:
MAX(CASE WHEN CVSig.ord = 1 THEN Employees.last_name END) AS Sig_1_Emp,
MAX(CASE WHEN CVSig.ord = 3 THEN Employees.last_name END) AS Sig_3_Staff
看看这样做是否奏效(请记住前面提到的注意事项)。如果您愿意,您可以保留ELSE NULL
,但如果所有情况都不是真的,则表达式将为NULL
;我认为在这种情况下,显式不值得付出代价(双关语)。
这篇关于SQL,Case When Then As的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文