逻辑是:更新表x,其中行最初来自select语句。
此存储过程始终失败:
DELIMITER $$
USE `sre`$$
DROP PROCEDURE IF EXISTS `sp_generateGraphicsAcc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_generateGraphicsAcc`(IN sa INT, IN thn VARCHAR(12), IN acc VARCHAR(12))
BEGIN
/*tmp_totalpesan.type_m = 1*/
/*first, update tmp_totalpesan to empty row(s)*/
UPDATE tmp_totalpesan SET totalpesan = '' WHERE type_m = 1;
/*second, update tmp_totalpesan from select statement.*/
UPDATE tmp_totalpesan tt
SET (tt.totalpesan =
SELECT COUNT(mp.quantity)
FROM mt_pesanan mp
WHERE (mp.ms_salesarea_idms_salesarea = sa )
AND (mp.tahun = thn)
AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc)
AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan))
GROUP BY mp.bulan)
WHERE type_m = 1;
END$$
DELIMITER ;
错误显示
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(tt.totalpesan = SELECT COUNT(mp.quantity) FROM mt_pesanan mp WH' at line 8
你能看出问题出在哪里吗? 感谢。
更新
这个存储过程想要实现的是:
假设我有1个表,它是事务表,我想从特定参数生成结果。
SELECT bla bla bla使用此查询的结果:
SELECT COUNT(mp.quantity), alter_monthname(MONTHNAME(tgl_pesan))
FROM mt_pesanan mp
WHERE (mp.ms_salesarea_idms_salesarea = sa )
AND (mp.tahun = thn)
AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc)
GROUP BY mp.bulan;
结果是
month - value
JANUARY - 1566
FEBRUARY - 800
依此类推......(12行)
我想要的是从结果中的select语句更新第二个表的值(1566,800等)。
相同的列名是select语句中对应于另一个表的月份。
如何实现这个目标?
实际上是问题
答案 0 :(得分:1)
您的括号未正确对齐。你是说这个吗?
UPDATE tmp_totalpesan tt
SET tt.totalpesan =
(SELECT COUNT(mp.quantity)
FROM mt_pesanan mp
WHERE (mp.ms_salesarea_idms_salesarea = sa )
AND (mp.tahun = thn)
AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc)
AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan))
GROUP BY mp.bulan
);
我的问题是group by
。此子查询可能返回多行,这将生成错误。如果where
子句选择要汇总的行,则不需要group by
。此外,通常使用名为quantity
的列,我希望sum()
或avg()
,而不是count()
。你确定count()
是你真正想要的吗?
编辑:
我认为没有group by
您的查询是正确的。您已经将tt
中的月份与子查询中的月份相关联:
UPDATE tmp_totalpesan tt
SET tt.totalpesan =
(SELECT COUNT(mp.quantity)
FROM mt_pesanan mp
WHERE (mp.ms_salesarea_idms_salesarea = sa )
AND (mp.tahun = thn)
AND (check_aksesoris_barang(mp.ms_langganan_idms_kodebarang) = acc)
AND tt.bulan = alter_monthname(MONTHNAME(mp.tgl_pesan))
);
但是,您可能希望在子查询中添加以下内容:
tt.bulan = mp.bulan