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, ->

我使用的是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,
    -> 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值发生了什么事?”是什么意思