解决方案 »
- 求sql语句..
- 求BSQL 2.0注册码
- navicat下设置mysql中varchar最大值
- MySQL有没有简单的实现 LIKE '%关键字%' 的方法?(不用支持通配符)
- Mysql 4.0.21 乱码问题
- mysql在那里可以管理trigger呢?insert的trigger在mysql中应该如何写呢?
- 怎样在JDBC中忽略Duplicate column错误?
- 表中显示的记录数和实际记录数不符
- mysql下面如何把字符串编码
- 请问MySQL得Blob得字段和longBlob字段限制了大小了?为什么我上传文件大了就不行呢?
- 【性能&成本】MySQL的内存资源评估
- mysql 汉字字节
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
BEGIN
DECLARE V_LoopDate date;
DECLARE V_BreakfastStart int;
DECLARE V_BreakfastEnd int;
DECLARE V_LunchStart int;
DECLARE V_LunchEnd int;
DECLARE V_BreakfastCi tinyint;
DECLARE V_LunchCi tinyint;
DECLARE V_ResultY varchar(4);
DECLARE V_ResultYM varchar(7);
DECLARE V_KqTime int;
DECLARE V_KqDataCi tinyint;
DECLARE V_Loop tinyint; SET V_ResultY=DATE_FORMAT(V_StartDate,'%Y');
SET V_ResultYM=DATE_FORMAT(V_StartDate,'%Y%m');
SET V_BreakfastCi =0;
SET V_LunchCi =0;
DELETE FROM kq_empyeardate WHERE EmpSysID=V_EmpSysID AND ResultY=V_ResultY;
INSERT INTO kq_empyeardate(GUID,EmpSysID,ResultY)VALUES(uuid(),V_EmpSysID,V_ResultY);
DELETE FROM kq_resultorderday;
DELETE FROM vkq_reportorderdaytotal Where EmpSysID=V_EmpSysID AND ResultDate>=V_StartDate AND ResultDate<=V_EndDate;
DELETE FROM vkq_reportordermonthtotal Where EmpSysID=V_EmpSysID AND ResultYM=V_ResultYM;
DELETE FROM vkq_reportorderyeartotal ;
SELECT BreakfastStart,BreakfastEnd,LunchStart,LunchEnd INTO V_BreakfastStart,V_BreakfastEnd,V_LunchStart,V_LunchEnd FROM kq_orderdate;
SET V_LoopDate=V_StartDate;
SET V_Loop=0;
WHILE V_LoopDate<=V_EndDate DO
SELECT count(*) INTO V_KqDataCi FROM kq_kqdata WHERE EmpSysID=V_EmpSysID AND KqDate=V_LoopDate ;
IF NOT EXISTS(select EmpSysID From kq_resultorderday WHERE EmpSysID=V_EmpSysID AND ResultDate=V_LoopDate) THEN
INSERT INTO kq_resultorderday(EmpSysID,ResultDate,ResultBreakfastCi,ResultLunchCi) values(V_EmpSysID,V_LoopDate,V_BreakfastCi,V_LunchCi);
END IF;
WHILE V_Loop<V_KqDataCi DO
SELECT KqTime INTO V_KqTime FROM kq_kqdata WHERE EmpSysID=V_EmpSysID AND KqDate=V_LoopDate limit V_Loop,1;
IF V_KqTime >=V_BreakfastStart AND V_KqTime <=V_BreakfastEnd THEN
SET V_BreakfastCi = V_BreakfastCi + 1;
UPDATE kq_resultorderday SET ResultBreakfastCi = ResultBreakfastCi + V_BreakfastCi WHERE EmpSysID=V_EmpSysID AND ResultDate=V_LoopDate;
END IF; IF V_KqTime >=V_LunchStart AND V_KqTime <=V_LunchEnd THEN
SET V_LunchCi = V_LunchCi + 1;
UPDATE kq_resultorderday SET ResultLunchCi =ResultLunchCi+V_LunchCi WHERE EmpSysID=V_EmpSysID AND ResultDate=V_LoopDate ;
END IF;
SET V_BreakfastCi =0;
SET V_LunchCi =0;
SET V_Loop= V_Loop + 1;
END WHILE;
SET V_Loop=0;
SET V_LoopDate=DATE_ADD(V_LoopDate,INTERVAL 1 DAY);
END WHILE;
CALL PKQ_SaveKQOrderDataView();
ENDCREATE DEFINER=`root`@`localhost` PROCEDURE `PKQ_SaveKQOrderDataView`()
BEGIN
DECLARE V_S varchar(8000);
DECLARE stop int DEFAULT 0;
DECLARE V_Column_Name varchar(100);
DECLARE curResultDay CURSOR FOR SELECT column_name FROM information_schema.columns where table_name = 'vkq_reportorderdaytotal';
DECLARE curResultMonth CURSOR FOR SELECT column_name FROM information_schema.columns where table_name = 'vkq_reportordermonthtotal';
DECLARE curResultYear CURSOR FOR SELECT column_name FROM information_schema.columns where table_name = 'vkq_reportorderyeartotal';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stop=1;
SET stop=0;
SET V_S='insert into vkq_reportorderdaytotal select ';
OPEN curResultDay;
FETCH curResultDay INTO V_Column_Name;
WHILE stop<>1 DO
SET V_S=CONCAT(V_S,' ',V_Column_Name,',' );
FETCH curResultDay INTO V_Column_Name;
END WHILE;
CLOSE curResultDay;
SET V_S=LEFT(V_S,LENGTH(V_S)-1);
SET V_S=CONCAT(V_S,' from vkq_reportorderdayext;');
CALL PSY_ExecSQL(V_S); SET stop=0;
SET V_S='insert into vkq_reportordermonthtotal select ';
OPEN curResultMonth;
FETCH curResultMonth INTO V_Column_Name;
WHILE stop<>1 DO
SET V_S=CONCAT(V_S,' ',V_Column_Name,',' );
FETCH curResultMonth INTO V_Column_Name;
END WHILE;
CLOSE curResultMonth;
SET V_S=LEFT(V_S,LENGTH(V_S)-1);
SET V_S=CONCAT(V_S,' from vkq_reportordermonthext;');
CALL PSY_ExecSQL(V_S); SET stop=0;
SET V_S='insert into vkq_reportorderyeartotal select ';
OPEN curResultYear;
FETCH curResultYear INTO V_Column_Name;
WHILE stop<>1 DO
SET V_S=CONCAT(V_S,' ',V_Column_Name,',' );
FETCH curResultYear INTO V_Column_Name;
END WHILE;
CLOSE curResultYear;
SET V_S=LEFT(V_S,LENGTH(V_S)-1);
SET V_S=CONCAT(V_S,' from vkq_reportorderyearext;');select V_S;
CALL PSY_ExecSQL(V_S);
ENDCREATE DEFINER=`root`@`localhost` PROCEDURE `PSY_ExecSQL`(V_S varchar(8000))
BEGIN SET @sql=V_S; PREPARE stm FROM @sql; EXECUTE stm; DEALLOCATE PREPARE stm;END
CREATE TABLE `kq_empyeardate` (
`GUID` varchar(36) NOT NULL,
`EmpSysID` varchar(36) NOT NULL,
`ResultY` varchar(10) NOT NULL,
PRIMARY KEY (`GUID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8CREATE TABLE `vkq_reportorderdaytotal` (
`EmpSysID` varchar(36) NOT NULL,
`EmpNo` varchar(10) DEFAULT NULL,
`EmpName` varchar(36) DEFAULT NULL,
`DepartID` varchar(12) DEFAULT NULL,
`DepartName` varchar(50) DEFAULT NULL,
`JobName` varchar(50) DEFAULT NULL,
`ResultDate` date NOT NULL,
`ResultBreakfastCi` int(4) DEFAULT NULL,
`ResultLunchCi` int(4) DEFAULT NULL,
PRIMARY KEY (`EmpSysID`,`ResultDate`),
UNIQUE KEY `AK_KQ_ReportDay` (`EmpSysID`,`ResultDate`),
KEY `AK_KQ_ReportDay2` (`EmpNo`),
KEY `AK_KQ_ReportDay3` (`DepartName`),
KEY `AK_KQ_ReportDay4` (`ResultDate`),
KEY `AK_KQ_ReportDay5` (`EmpName`),
KEY `AK_KQ_ReportDay6` (`DepartID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8CREATE TABLE `vkq_reportordermonthtotal` (
`EmpSysID` varchar(36) NOT NULL,
`EmpNo` varchar(10) NOT NULL,
`EmpName` varchar(50) DEFAULT NULL,
`DepartID` varchar(10) DEFAULT NULL,
`DepartName` varchar(50) DEFAULT NULL,
`JobName` varchar(50) DEFAULT NULL,
`ResultYM` varchar(8) NOT NULL,
`OrderID` tinyint(1) DEFAULT NULL,
`OrderName` char(4) DEFAULT NULL,
`D01` int(4) DEFAULT NULL,
`D02` int(4) DEFAULT NULL,
`D03` int(4) DEFAULT NULL,
`D04` int(4) DEFAULT NULL,
`D05` int(4) DEFAULT NULL,
`D06` int(4) DEFAULT NULL,
`D07` int(4) DEFAULT NULL,
`D08` int(4) DEFAULT NULL,
`D09` int(4) DEFAULT NULL,
`D10` int(4) DEFAULT NULL,
`D11` int(4) DEFAULT NULL,
`D12` int(4) DEFAULT NULL,
`D13` int(4) DEFAULT NULL,
`D14` int(4) DEFAULT NULL,
`D15` int(4) DEFAULT NULL,
`D16` int(4) DEFAULT NULL,
`D17` int(4) DEFAULT NULL,
`D18` int(4) DEFAULT NULL,
`D19` int(4) DEFAULT NULL,
`D20` int(4) DEFAULT NULL,
`D21` int(4) DEFAULT NULL,
`D22` int(4) DEFAULT NULL,
`D23` int(4) DEFAULT NULL,
`D24` int(4) DEFAULT NULL,
`D25` int(4) DEFAULT NULL,
`D26` int(4) DEFAULT NULL,
`D27` int(4) DEFAULT NULL,
`D28` int(4) DEFAULT NULL,
`D29` int(4) DEFAULT NULL,
`D30` int(4) DEFAULT NULL,
`D31` int(4) DEFAULT NULL,
`Total` int(4) DEFAULT NULL,
KEY `AK_KQ_ReportOrderM` (`EmpName`) USING BTREE,
KEY `AK_KQ_ReportOrderM2` (`EmpNo`),
KEY `AK_KQ_ReportOrderM3` (`DepartID`),
KEY `AK_KQ_ReportOrderM4` (`DepartName`),
KEY `AK_KQ_ReportOrderM5` (`ResultYM`),
KEY `AK_KQ_ReportOrderM6` (`EmpName`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8CREATE TABLE `vkq_reportorderyeartotal` (
`EmpSysID` varchar(36) NOT NULL,
`EmpNo` varchar(20) DEFAULT NULL,
`EmpName` varchar(50) DEFAULT NULL,
`DepartID` varchar(12) DEFAULT NULL,
`DepartName` varchar(50) DEFAULT NULL,
`JobName` varchar(50) DEFAULT NULL,
`ResultY` varchar(4) NOT NULL,
`ResultBreakfastCi` int(4) DEFAULT NULL,
`ResultLunchCi` int(4) DEFAULT NULL,
PRIMARY KEY (`EmpSysID`,`ResultY`),
UNIQUE KEY `AK_VKQ_ReportOderYTotal` (`ResultY`,`EmpSysID`),
KEY `AK_VKQ_ReportOderYTotal2` (`EmpNo`),
KEY `AK_VKQ_ReportOderYTotal3` (`DepartName`),
KEY `AK_VKQ_ReportOderYTotal4` (`ResultY`),
KEY `AK_VKQ_ReportOderYTotal5` (`DepartID`),
KEY `AK_VKQ_ReportOderYTotal6` (`EmpName`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8还有几张视图,跟vkq_reportorderdaytotal,vkq_reportordermonthtotal,vkq_reportorderyeartotal表机构一模一样,目前是这么设计的