我正在尝试在SQL Server 2008中针对某些数据输入不一致的表运行查询,我必须处理这个问题.
表数据示例:
OrderID Qty Price MarkedUpTotal
1 10 1.00 11.00
1 -1 1.00 -1.10
1 -1 1.00 1.10
Run Code Online (Sandbox Code Playgroud)
我必须处理数量为负数但MarkedUpTotal输入为正数的情况.
我想运行以下查询:
SELECT OrderID, SUM(Qty) as OrderTotalQty,
SUM(Qty*Price) as InternalCost,
CASE WHEN Qty < 0 and MarkedUpTotal > 0
THEN sum(-1*MarkedUpTotal)
ELSE SUM(MarkedUpTotal) END as ClientCost
FROM OrderItems
GROUP BY OrderID
Run Code Online (Sandbox Code Playgroud)
但是,运行此查询时出现以下错误:
列数量在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
列MarkedUpTotal在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
我希望得到以下结果:
OrderID OrderTotalQty InternalCost ClientCost
1 8 8.00 8.80
Run Code Online (Sandbox Code Playgroud)
我似乎很奇怪,当它们仅被CASE声明有条件地使用时,我必须是GROUP BY Qty和MarkedUpTotal.如果我删除最后一个选择(CASE语句),查询执行正常,并且不要求数量或价格在GROUP BY中.
为什么SQL需要这个?是否有一个查询可以完成上述任务?
目前我正在使用临时表来解决问题.如果需要,我会修改每个条目的MarkedUpTotal,然后在临时表的主查询中执行简单的SUM(MarkedUpTotal).
我正在挖掘mysql_safe(试图添加一些选项),我遇到了这种用于从Launch Agent分配变量的bash脚本技术:com.mysql.mysqld.plist(我在mac上).
现在mysqld_safe不知道它是由LaunchCtl调用的,所以我假设任何选项都是由LaunchCtl转换成命令行参数,但我发现这个sytnax入侵了.谁知道这是如何工作的?
我理解Bash中Case/Switch的基础知识:
case "$myval" in
switch1) do something;;
switch2) do something;;
*) do whatever fallthrough logic;;
esac
Run Code Online (Sandbox Code Playgroud)
默认情况下通过使用*在下面的脚本块中,arg值是:" - baseased ="或"--datadir ="或"--pid-file ="等等但是什么与*in那里?
这是Switch语句中的正则表达式吗?
有一个后卫?
for arg do
# the parameter after "=", or the whole $arg if no match
val=`echo "$arg" | sed -e 's;^--[^=]*=;;'`
# what's before "=", or the whole $arg if no match
optname=`echo "$arg" | sed -e 's/^\(--[^=]*\)=.*$/\1/'`
# replace "_" by "-" ; mysqld_safe must accept "_" like mysqld does.
optname_subst=`echo "$optname" …Run Code Online (Sandbox Code Playgroud) 我一直在尝试为下面的查询创建一个条件where子句,但我一直看到很多替代方案,我不知道在这种情况下使用什么.
我需要的是这样的东西:(当然这个代码是错误的)
where casCaseType='m'
and casCurrentWorkflowID=990
and cmsDateCreated between @FromDate and @ToDate
CASE @WFStatus
WHEN @WFStatus=1 then eveworkflowID<100
WHEN @WFStatus=2 then eveworkflowID<200
WHEN @WFStatus=3 then eveworkflowID<300
WHEN @WFStatus=4 then eveworkflowID<400
ELSE 0
END
Run Code Online (Sandbox Code Playgroud)
因此,当我选择WFStatus参数为1时,它会自动使用where子句的那一部分,只显示那些eveworkflowID小于100的结果.
任何帮助将不胜感激!
谢谢
好的,情况如下:
我有一个客户端有2个设置:ConnectionState和ConnectionSollState,都是相同的可枚举(TypeConnectionState),它们存储客户端连接的实际状态和连接应该是的状态.在to的每个组合上,都会发生不同的事情,例如ConnectionState为"已连接"但ConnectionSollState为"已关闭" - >拆除客户端.所以我有4种可能性需要检查.现在每个客户端都可以处理无限数量的会话,并且每个会话都有一个状态(StreamState和StreamSollState),这些状态可以有6个可枚举的选项.
从现在开始,我正在制作20个切换条件,我的代码看起来非常混乱,我在编码时每5分钟做错一次.有没有更简单的方法来处理这样的情况?(if/else)会让事情变得更糟.
例:
private void RTSPWorker() {
try {
byte[] buffer = new byte[2048];
while (!mb_RTSPWorkerAbbort) {
// Call TransportWD
Thread.Sleep(100 * mi_ConnectionTimeOut);
// Check ConnectionSollState
switch(ConnectionSollState) {
case TypeConnectionState.Connected:
// ConnectionSollState = Connected, check ConnectionState
switch(ConnectionState) {
case TypeConnectionState.Connected:
// ConnectionState is connected, keep-alive!
if(GET_PARAMETER() == null) {
DESCRIBE();
}
// Check streams too
foreach (cRTSPStream oStream in mo_StreamDict.Values) {
// Check StreamSollState
switch(oStream.RTSPStreamSollState) {
case cRTSPStream.TypeRTSPStreamState.Play:
// SollState is PLAY, check State
switch(oStream.RTSPStreamState) {
case …Run Code Online (Sandbox Code Playgroud) c# if-statement coding-style case-statement switch-statement
这很好用:
select
case (1+2) -- (or_some_more_complicated_formula_yielding_a_numeric_result)
when 200 then '200'
when 100 then '100'
else 'other'
end hi_med_low
from dual ;
Run Code Online (Sandbox Code Playgroud)
但我需要做更多这样的事情:
select
case (1+2) -- (or_some_more_complicated_formula_yielding_a_numeric_result)
when greater than 200 then 'high'
when less than 100 then 'low'
else 'medium'
end hi_med_low
from dual ;
Run Code Online (Sandbox Code Playgroud)
建议?
我试图在case语句中使用一个字符串,但它让我expected a discrete type. Found type Standard.String明白字符串不是离散的.我想知道是否有工作.这是我的代码:
function Is_Valid_Direction(Direction_To_Go : in String) return Integer is
Room : Integer := 0;
begin
--if (Direction_To_Go = "NORTH" or Direction_To_Go = "N") then
-- Room := Building(currentRoom).exits(NORTH);
--elsif (Direction_To_Go = "SOUTH" or Direction_To_Go = "S") then
-- Room := Building(currentRoom).exits(SOUTH);
--elsif (Direction_To_Go = "EAST" or Direction_To_Go = "E") then
-- Room := Building(currentRoom).exits(EAST);
--elsif (Direction_To_Go = "WEST" or Direction_To_Go = "W") then
-- Room := Building(currentRoom).exits(WEST);
--elsif (Direction_To_Go = "UP" or …Run Code Online (Sandbox Code Playgroud) 我想知道如何从案例通配符中获取值?我有一个为我生成菜单的数组。然后我有一个案例来确定选择了哪个选项。case 语句的最后一部分是通配符值。我正在寻找用于通配符的值。
这是我正在使用的代码:
menu=()
menu+=('Option 1')
menu+=('Option 2')
menu+=('Option 3')
menu+=('Option 4')
menu+=('Quit')
echo "What would you like to install?"
echo " "
select opt in "${menu[@]}"
do
case $opt in
'Option 1' )
echo "Doing Option 1"
;;
'Option 2' )
echo "Doing Option 2"
;;
'Option 3' )
echo "Doing Option 3"
;;
'Option 4' )
echo "Doing Option 4"
;;
'Quit' )
echo "Quitting installations"
exit;
;;
* )
echo "Invalid input: ${opt}"
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
在上面,“无效输入”值始终为空。我可以输入“foobar”作为选项,但它不显示。我也将变量更改为 …
我正在根据哈希值分配一组值.
我必须根据传入的哈希键的值为另一个哈希键分配值.
传入哈希中有超过10个键(因此超过10个案例).
我想最小化代码.是否有任何替代方法可以缩短代码.
@hash1.each do |h1|
case h1.mapped_field
when 'value1'
@hash2[h1.field_id] = value_1
when 'value2'
@hash2[h1.field_id] = value_2
when 'value3'
@hash2[h1.field_id] = value_3
when 'value4'
@hash2[h1.field_id] = value_4
when 'value5'
@hash2[h1.field_id] = value_5
end
end
Run Code Online (Sandbox Code Playgroud) 我有一个名为compositeRate 的列,它是一个decimal(10,2) 数据类型。我正在编写一个 Select 语句,如果 compositeRate 为 0.00,则应返回空字符串,但我收到此错误:Msg 8114,级别 16,状态 5,第 1 行将数据类型 varchar 转换为数字时出错。
这是我的案例陈述
select CASE WHEN compositeRate = 0.00 THEN '' else compositeRate from table
Run Code Online (Sandbox Code Playgroud)
您能告诉我应该在案例陈述中的哪里写“convert”吗?
是否可以在C中切换案例中的案例数而无需手动添加在每种情况下递增的计数器变量?
case-statement ×10
sql ×3
bash ×2
case ×2
ada ×1
arrays ×1
c ×1
c# ×1
coding-style ×1
counting ×1
group-by ×1
if-statement ×1
oracle ×1
ruby ×1
sql-server ×1
string ×1
where-clause ×1