-1

提供了完整的示例供您尝试解决。问题是我想添加两列('MUNTAX' AND 'SCHTAX')并将结果放入表('house')的第三列('TOTALTAX')中。但是,这些列是 varchar 类型的价格而不是整数,所以我必须在计算之前删除“$”符号和“,”。并且经过计算,必须将'$'和','中的总和转换回varchar。

我被挂断的地方是得到总数。

创建表:

CREATE TABLE `house` (
`ID` int(10) unsigned NOT NULL auto_increment,
`MLS_NO` int(10) default NULL,
`AGENT` varchar(120) default NULL,
`DISP_ORDER` int(4) default NULL,
`ADDR` varchar(200) NOT NULL default '',
`PRICE` varchar(12) NOT NULL default '',
`PRTYPE` varchar(20) default NULL,
`BUILTYPE` varchar(30) default NULL,
`YEAR` varchar(4) default NULL,
`LAREA` decimal(10,0) default NULL,
`ROOM` decimal(10,0) default NULL,
`BEDROOM` decimal(10,0) default NULL,
`BATHROOM` decimal(10,0) default NULL,
`PWDRROOM` decimal(10,0) default NULL,
`GARAGE` decimal(10,0) default NULL,
`PARKING` decimal(10,0) default NULL,
`MUNTAX` varchar(30) default NULL,
`SCHTAX` varchar(30) default NULL,
`TOTALTAX` varchar(30) default NULL,
`DESCR` text,
`DEFAULTPIC` decimal(10,0) default NULL,
`ADTYPE` varchar(100) default NULL,
`DESCR_2` text,
PRIMARY KEY  (`ID`),
KEY `Index_2` (`ADDR`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=122 ;

INSERT INTO `house` (`ID`, `MLS_NO`, `AGENT`, `DISP_ORDER`, `ADDR`, `PRICE`, `PRTYPE`, `BUILTYPE`, `YEAR`, `LAREA`, `ROOM`, `BEDROOM`, `BATHROOM`, `PWDRROOM`, `GARAGE`, `PARKING`, `MUNTAX`, `SCHTAX`, `TOTALTAX`, `DESCR`, `DEFAULTPIC`, `ADTYPE`, `DESCR_2`) VALUES (110, 8620825, 'N', NULL, '5871 FL', '$1,025,000.0', 'DETACHED', 'COTTAGE', NULL, '589', '10', '4', '3', '1', NULL, '4', '$7,774.42', NULL, 'NULL', 'Beautiful');

存储过程:

DELIMITER $$
DROP PROCEDURE IF EXISTS TotalTaxProc $$

CREATE PROCEDURE TotalTaxProc(IN MLS INT(10), OUT MUNFLO FLOAT(10), OUT SCHINT FLOAT(10), OUT TOTTAX VARCHAR(10))
BEGIN
DECLARE SCH VARCHAR(30);
DECLARE MUN VARCHAR(30);

SET SCHFLO=0.0;
SET MUNFLO=0.0;
SET TOTTAX='';

SELECT MUNTAX FROM house WHERE MLS_NO=MLS INTO MUN;
SELECT SCHTAX FROM house WHERE MLS_NO=MLS INTO SCH;

SET MUNFLO=IFNULL(REPLACE(REPLACE(MUN, '$', ''), ',', ''), 0);
SET SCHFLO=IFNULL(REPLACE(REPLACE(SCH, '$', ''), ',', ''), 0);

SET TOTTAX=CONCAT('$', MUNFLO + SCHFLO ) ;

SET TOTTAX=CONCAT(SUBSTRING_INDEX(TOTTAX, SUBSTRING(TOTTAX, -6), 1),',',SUBSTRING(TOTTAX, -6) );


UPDATE house SET TOTALTAX=TOTTAX WHERE MLS_NO=MLS;
END $$
DELIMITER ;

最后是电话,

CALL TotalTaxProc(8620825,@MUNINT,@SCHINT,@TOTTAX);
SELECT @MUNINT,@SCHINT,@TOTTAX;

所以很明显我得到的只是逗号,TOTTAX 应该给出 '$7,774.42'

4

2 回答 2

0

我在您的代码中没有看到您设置@TOTTAX 用户变量的任何地方。(您正在修改名称相似的过程变量 TOTTAX,但我在任何地方都看不到对用户变量 @TOTTAX 的引用,除了在您的调用和选择中。)

阻止您使用它的 FORMAT 函数是否存在问题,而不是所有那些 SUBSTRING 和 SUBSTRING_INDEX 函数?

SET TOTTAX=CONCAT('$',FORMAT(MUNFLO+SCHFLO,2));

FORMAT() 函数应注意确保小数点后有两位数加上逗号分隔符,您不需要使用所有这些SUBSTRINGSUBSTRING_INDEX索引函数。


我将在这里回应 spacediver 的评论:UPDATE 语句似乎将更新 house 表中的每一行,并具有相同的值。(这可能没有错,但看起来很奇怪,在我的大多数 UPDATE 语句中,没有 JOIN 或 WHERE 子句,某种指定要更新的行的谓词是错误的。)


更新

您已更新您的问题(进行了一些重大改进)

奇怪的是,您正在运行两个单独的查询以从(可能)同一行获取不同的列。这两个单独的语句:

SELECT MUNTAX FROM house WHERE MLS_NO=MLS INTO MUN;
SELECT SCHTAX FROM house WHERE MLS_NO=MLS INTO SCH;

可以用单个选择替换:

SELECT MUNTAX, SCHTAX FROM house WHERE MLS_NO=MLS INTO MUN,SCH;

据我所知,这一行:

SET TOTTAX=CONCAT(SUBSTRING_INDEX(TOTTAX, SUBSTRING(TOTTAX, -6), 1),',',SUBSTRING(TOTTAX, -6) );

没有做任何有用的事情。(根本不清楚这需要做什么或检查该FORMAT()功能是否无法为您做。为什么需要线,它应该做什么?

您似乎正在将(显然)存储为格式化字符串(ACCCKKK!)的十进制值转换为一个INTEGER值,该值基本上丢失了小数点后的两位。

然后,您将一个值计算为该行中其他两个值的总和,然后将结果作为“格式化”字符值分配给 TOTALTAX 列。奇怪的是,您正在将一个 INTEGER 值分配回 SCHTAX(字符)列,您之前期望它是一个十进制值作为格式化字符串。

您的“最终解决方案”中的代码没有通过集合。

我没有看到这里正在完成的任何事情都不能在单个 SQL 语句中更容易地完成(并且更容易理解)。

假设 MLS_NO 列是唯一的(或者您打算使用行中已经存在的值更新单行),那么

CREATE PROCEDURE TotalTaxProc(IN MLS INT(10))
BEGIN

UPDATE house
   SET TOTALTAX = CONCAT('$',FORMAT(
         IFNULL(REPLACE(REPLACE(MUNTAX, '$', ''), ',', ''), 0) 
       + IFNULL(REPLACE(REPLACE(SCHTAX, '$', ''), ',', ''), 0)
       ,2))
 WHERE MLS_NO=MLS;

END $$

容易理解,没有所有的过程变量和 SET 语句,以及所有的旋转。

如果多行具有相同的 MLS_NO,则此语句的行为与您的过程不同。

此语句为 TOTALTAX 列分配一个值,该值派生自同一行中的值。另一方面,您的过程使用具有匹配 MLS_NO 的某一行中的值来更新具有相同匹配 MLS_NO 的所有行。(如果 MLS_NO 是唯一的,则没有区别,如果不是唯一的,则有区别。)

这也与“最终解决方案”中的代码不同,因为在计算要分配给 TOTALTAX 的值时不会丢失小数点后的数字(可以很容易地添加)。(如果您想丢失数字,您确定要在将它们相加之前这样做,还是在添加之后要丢失它们。

此语句的不同之处还在于它没有重新格式化 SCHTAX 列的值。(可以很容易地添加这种行为,只需在同一语句中添加一个简单的内容。)

您的程序会将SCHTAX 列的值从例如'$6,543.21' 更改为'6543',完全不清楚为什么需要这样做。(我在想 SCHTAX 和 MUNTAX 字符串值中可能有一些不是数字的东西,比如'/yr'' per year'或者' (paid 2012)'您打算忽略的其他内容,这就是为什么您将其存储为字符然后提取十进制值的原因。


于 2012-07-19T22:08:22.677 回答
0

最终解决方案:

DELIMITER //
DROP PROCEDURE IF EXISTS TotalTaxProc //

CREATE PROCEDURE TotalTaxProc(IN MLS INT(10))
BEGIN
DECLARE SCH VARCHAR(30);
DECLARE MUN VARCHAR(30);
DECLARE SCHFLO FLOAT(15,2);
DECLARE MUNFLO FLOAT(15,2);
DECLARE TOTTAX VARCHAR(30);

SET SCHFLO=0.00;
SET MUNFLO=0.00;
SET TOTTAX='';

SELECT MUNTAX FROM HOUSE WHERE MLS_NO=MLS INTO MUN;
SELECT SCHTAX FROM HOUSE WHERE MLS_NO=MLS INTO SCH;

SET MUNFLO=CAST( IFNULL(REPLACE(REPLACE(MUN, '$', ''),',',''), '0.00') * 100 AS DECIMAL);
SET SCHFLO=CAST( IFNULL(REPLACE(REPLACE(SCH, '$', ''),',',''), '0.00') * 100 AS DECIMAL);


SET TOTTAX=CONCAT('$',FORMAT(MUNFLO/100+SCHFLO/100,2));


UPDATE HOUSE SET TOTALTAX=TOTTAX WHERE MLS_NO=MLS;
END //
DELIMITER ;

和电话:

CALL TotalTaxProc(8620825);
于 2012-07-20T13:03:17.697 回答