SQL,Case When Then As [英] sql, case when then as

查看:0
本文介绍了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_idprogram_idvisittyperev_timein)在两个样本行中包含相同的值。如果GROUP BY这四列,则样例行将被分组为一行,因为它们的值相同。我不知道为什么您不在这里显示non_billable,但是这个概念扩展到您想用来定义不同组的所有列。

由于sig_1_empsig_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆