2012-01-30 4 views
2

SQL 선택 쿼리 후,이 배열에 쓰여진 배열이 합계 (값) AS Total_Values ​​열과 합계를 더하고 싶습니다. - 값) Diff_Values ​​열 AS 값, 나는 여러 가지 방법을 시도했지만 내가 옳은 일행과 합계와 행의 차이로부터의 합계

없어요

내 현재 쿼리의 결과는 무엇인가 같다 :

Car_Number Start_time Code_nr Values Total_Values 
BH-07-EWR 08:59:00 C00425 7000 44400 
BH-07-EWR 10:29:00 C00149 8500 44400 
BH-07-EWR 14:27:00 C01075 9200 44400 
BH-07-EWR 15:07:00 C00305 9800 44400 
BH-07-EWR 16:08:00 C02572 9900 44400 

그리고 나는 그것이 싶습니다 :

Car_Number Start_time Code_nr Values Total_Values Diff_Values 
BH-07-EWR 08:59:00 C00425 7000 44400   44400 
BH-07-EWR 10:29:00 C00149 8500 44400   37400 
BH-07-EWR 14:27:00 C01075 9200 44400   28900 
BH-07-EWR 15:07:00 C00305 9800 44400   19700 
BH-07-EWR 16:08:00 C02572 9900 44400   9900 

어떻게해야합니까? 상황이 더 쉬울 수도 있지만 내 경험에 대해서는 좀 더 복잡합니다. 감사합니다

업데이트 :

예 SQL :

SELECT *, SUM(MINUTE(rest_time)) AS Times FROM routes as routes 
LEFT JOIN sales ON (routes.departure_poi_code = sales.client_code 
       AND routes.departure_date = sales.date) 
WHERE (routes.departure_poi_code LIKE 'C0%' 
     OR routes.departure_poi_code LIKE 'MP%') 
     AND routes.car_no = 'BH-07-EWR' 
     AND routes.departure_date = '2011-10-14' 
GROUP BY routes.departure_address, reports.routes.departure_poi_code, reports.routes.car_no, reports.routes.departure_date 
ORDER BY routes.car_no LIMIT 500000 ; 

물론 쿼리가되게됩니다 더 많은 열을 반환합니다.

+0

이렇게하면 도움이 될 수 있습니다. http://stackoverflow.com/q/5483319/535275 –

+0

쿼리 및 테이블 스키마가 무엇입니까? – Abhay

+0

SELECT * 시간 AS LEFT 가 ON (= routes.departure_poi_code sales.client_code AND routes.departure_date = sales.'date') (routes.departure_poi_code 판매 가입 루트로서 루트 FROM, SUM (MINUTE (rest_time)) LIKE 'C0 %'또는 경로.출발 경로 : 'MP %') AND 경로. 'car_no' ='BH-07-EWR ' AND routes.departure_date ='2011-10-14 ' GROUP BY routes.departure_address, reports.routes.departure_poi_code, 보고서 .routes.car_no, reports.routes.departure_date ORDER BY routes.car_no LIMIT 500000; 물론 querry는 더 많은 colum을 반환합니다. –

답변

3

테이블 이름이 TBL이라고 가정합니다.

SELECT TBL.*, Total_Values, @R:=IF(@R=0, Total_Values, @R-TBL.`Values`) AS Diff_Values 
    FROM TBL, (SELECT @R:=0, SUM(`Values`) AS Total_Values FROM TBL) x; 
+0

적어도 나만 시도해 볼 때까지는 나에게 많은 의미가 없지만 잘 쓰여진 질의가 있습니다. 큰 @lqez! – Abhay

+0

@Abhay 정말 고마워! – lqez

0

실제로 이것은 까다로울 수 있습니다. 쿼리에서이를 수행하는 방법을 알 수는 없지만 스토어드 프로 시저가 그 방법 일 수 있습니다.

쿼리의 결과 집합이 TMPTBL 인 중간 테이블에 저장되고 각 행이 고유 한 ID로 식별된다고 가정합니다. 그래서 TMPTBL는 다음과 같이됩니다 : 당신이 저장 프로 시저의 일부로 수행됩니다 Total_Values을 계산 할 필요가 없습니다

id Car_Number Start_time Code_nr Values 
1 BH-07-EWR 08:59:00 C00425 7000 
2 BH-07-EWR 10:29:00 C00149 8500 
3 BH-07-EWR 14:27:00 C01075 9200 
4 BH-07-EWR 15:07:00 C00305 9800 
5 BH-07-EWR 16:08:00 C02572 9900 

참고.

지금 아래와 같은 프로 시저를 만들 :

DELIMITER ;; 
CREATE PROCEDURE spCompute() 
BEGIN 
    DECLARE idn INT; 
    DECLARE vals INT; 
    DECLARE totVals INT DEFAULT 0; 
    DECLARE noData INT DEFAULT FALSE; 
    DECLARE csrData CURSOR FOR SELECT `id`, `Values` FROM `TMPTBL` ORDER BY `id` DESC; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET noData = TRUE; 

    OPEN csrData; 
    startLoop: LOOP 
     FETCH csrData INTO idn, vals; 
     IF noData THEN 
      LEAVE startLoop; 
     END IF; 
     SET totVals = totVals + vals; 
     UPDATE `TMPTBL` SET `Diff_Values` = totVals WHERE `id` = idn; 
    END LOOP; 
    UPDATE `TMPTBL` SET `Total_Values` = totVals; 
    CLOSE csrData; 
END;; 
DELIMITER ; 

아이디어는 오히려 차이점을하는 것보다, 절차 대신 값을 추가합니다. 이제 TMPTBL에서 SELECT 쿼리를 실행하면 Diff_Values ​​및 Total_Values가 표시됩니다. 절차를 테스트하지는 않았지만 제대로 작동해야한다고 생각합니다.

몇 가지 참고 사항 :

  1. 내가 TMPTBL가 쿼리
  2. TMPTBL이 이미 존재하는 모든 포함하는 테이블에 TOTAL_VALUES을 계산 할 필요가 없습니다 id를 열
  3. 을 가지고 있다고 가정했습니다 검색어의 열 (Total_Values ​​제외)

희망 하시겠습니까?

+0

지금 해보니, 피드 덕분에 되겠습니다. –

+0

감사합니다. –