Mysql 表中未显示生成列的值
我使用的是mysql版本Mysql 表中未显示生成列的值,mysql,mysql-5.1,Mysql,Mysql 5.1,我使用的是mysql版本5.1.41-3ubuntu12.10(Ubuntu) 到目前为止还不错。如您所见,0.5显示为if(pz*uz,1.5)。问题是: mysql> select os, -> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo, -> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree, ->
5.1.41-3ubuntu12.10(Ubuntu)
到目前为止还不错。如您所见,0.5显示为if(pz*uz,1.5)
。问题是:
mysql> select os,
-> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo,
-> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree,
-> sum(p) p,sum(c) c
-> from tt t
-> group by os,uptwo,upthree order by null;
+----+-------+---------+---------+-------+
| os | uptwo | upthree | p | c |
+----+-------+---------+---------+-------+
| u | 1 | 1 | 52852 | 318 |
| i | 1 | 1 | 7046563 | 21716 |
| m | 1 | 1 | 1252166 | 7337 |
| i | 0 | 0 | 1830284 | 4033 |
| m | 0 | 0 | 294612 | 1714 |
| i | 1 | 0 | 911486 | 3560 |
| m | 1 | 0 | 145182 | 1136 |
| u | 0 | 0 | 12144 | 23 |
| u | 1 | 0 | 1571 | 8 |
+----+-------+---------+---------+-------+
mysql>选择操作系统,
->如果(pz*uz,left(pz,2)left(lpad(uz,5,0),2),.5)向上两个方向,
->如果(pz*uz,left(pz,3)left(lpad(uz,5,0),3),.5)向上倾斜,
->求和(p)p,求和(c)c
->从tt t
->按操作系统分组,向上两次,向上三次按空排序;
+----+-------+---------+---------+-------+
|奥斯|上两个|上三个| p | c|
+----+-------+---------+---------+-------+
|u | 1 | 1 | 52852 | 318|
|i | 1 | 1 | 7046563 | 21716|
|m | 1 | 1 | 1252166 | 7337|
|i | 0 | 0 | 1830284 | 4033|
|m | 0 | 0 | 294612 | 1714|
|i | 1 | 0 | 911486 | 3560|
|m | 1 | 0 | 145182 | 1136|
|u | 0 | 0 | 12144 | 23|
|u | 1 | 0 | 1571 | 8|
+----+-------+---------+---------+-------+
虽然I按uptwo进行分组,但0.5不会出现在该列中。0.5的值发生了什么变化
编辑:正如在对的评论中所指出的,我也用
if(pz*uz,cast(left(pz,2)left(lpad(uz,5,0),2)作为十进制),.5)
而不是
if(pz*uz,left(pz,2)left(lpad(uz,5,0),2),.5)
,但它也不起作用。我认为您在以下陈述中有问题:
-> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo,
-> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree,
->if(pz*uz,left(pz,2)left(lpad(uz,5,0),2),.5)uptwo,
->如果(pz*uz,left(pz,3)left(lpad(uz,5,0),3),.5)向上倾斜,
在语句中,pz*uz
的值必须始终大于或等于1
因此,第一个表达式的值用于替换第二个表达式
0.5
让我们首先分析if
function语句:语法:
IF(expr1、expr2、expr3)
意思是
如果expr1的值>=1,则使用expr1,否则使用expr3
表达式1:
pz*uz
//此值必须为'>=1'
表达式2:
左(pz,2)左(lpad(uz,5,0),2)
//此值为'1'
或'0'
表达3:
.5
我认为您在以下陈述中有问题:
-> if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),.5) uptwo,
-> if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),.5) upthree,
->if(pz*uz,left(pz,2)left(lpad(uz,5,0),2),.5)uptwo,
->如果(pz*uz,left(pz,3)left(lpad(uz,5,0),3),.5)向上倾斜,
在语句中,pz*uz
的值必须始终大于或等于1因此,第一个表达式的值用于替换第二个表达式
0.5
让我们首先分析if
function语句:语法:
IF(expr1、expr2、expr3)
意思是
如果expr1的值>=1,则使用expr1,否则使用expr3
表达式1:
pz*uz
//此值必须为'>=1'
表达式2:
左(pz,2)左(lpad(uz,5,0),2)
//此值为'1'
或'0'
表达式3:
.5
我认为uptwo和upthree列正在隐式转换为整数。在expression2上使用convert()将其强制为十进制。我认为uptwo和upthree列被隐式转换为整数。在表达式2上使用convert()将其强制为十进制。而不是.5
作为IF()
的假条件,请使用0.5
if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),0.5) uptwo
if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),0.5) upthree
if(pz*uz,left(pz,2)left(lpad(uz,5,0),2),0.5)uptwo
如果(pz*uz,left(pz,3)left(lpad(uz,5,0),3),0.5)向上
我相信现在发生的是,在计算GROUP BY
之后,条件列中的值必须是相同的数据类型。由于SELECT
是在groupby
之后计算的,因此IF()
将返回值转换为整数(来自布尔表达式),因此您的0.5
将四舍五入为1
,但如果您在小数点前明确放置0
,则IF()
将返回值视为十进制,包括布尔表达式的结果(即1.0
或0.0
)
或者您甚至可以在
.4
周围加上单引号,这样列值将被视为字符串,因此一些值将显示为整数和小数。在数字环境中使用时(即选择('2.5'*3.5)作为测试#8.75
),应自动转换值。而不是.5
作为IF()
的假条件,使用0.5
if(pz*uz,left(pz,2)<=>left(lpad(uz,5,0),2),0.5) uptwo
if(pz*uz,left(pz,3)<=>left(lpad(uz,5,0),3),0.5) upthree
if(pz*uz,left(pz,2)left(lpad(uz,5,0),2),0.5)uptwo
如果(pz*uz,left(pz,3)left(lpad(uz,5,0),3),0.5)向上
我相信现在发生的是,在计算GROUP BY
之后,条件列中的值必须是相同的数据类型。由于SELECT
是在groupby
之后计算的,因此IF()
将返回值转换为整数(来自布尔表达式),因此您的0.5
将四舍五入为1
,但如果您在小数点前明确放置0
,则IF()
将返回值视为十进制,包括布尔表达式的结果(即1.0
或0.0
)
或者您甚至可以在
.4
周围加上单引号,这样列值将被视为字符串,因此一些值将显示为整数和小数。在数字环境中使用时,应自动转换这些值(即,选择('2.5'*3.5)作为测试#8.75
)。不知道如何标记。任何能这样做的人,请这样做!我不明白,你说的“uptwo(实际上是upthree)列中的0.5值发生了什么事?”是什么意思