2012-09-11 2 views
2

다음 mysql 쿼리를 알아 내는데 어려움이 있습니다.mysql - 여러 열 및 합계로 그룹화

이것은 사용자가 수행 한 작업에 따라 특정 요율을 추적하는 일종의 시간 추적을 의미합니다. 요약을해야하므로 주말에 사용자에게 무엇을 지불해야하는지 알 수 있습니다.

-----------tSessions--------------------------- 
|id  |userid |typeid |session_length_min 
----------------------------------------------- 
|1  |1  |1  |30 
----------------------------------------------- 
|2  |1  |1  |45 
----------------------------------------------- 
|3  |1  |2  |(null) 
----------------------------------------------- 
|4  |2  |2  |(null) 
----------------------------------------------- 


-----------tUsers----------------------------------------------------------------------------------- 
|id  |name |rate_cleaning_30_min |rate_cleaning_45_min |rate_kitchenwork |rate_dogwalking 
---------------------------------------------------------------------------------------------------- 
|1  |Tom |30      |50      |40    |20 
---------------------------------------------------------------------------------------------------- 
|2  |Joe |35      |60      |45    |20 
---------------------------------------------------------------------------------------------------- 
|3  |Dave |40      |60      |30    |10 
---------------------------------------------------------------------------------------------------- 


-----------tTypes---------------- 
|id  |name 
--------------------------------- 
|1  |Cleaning 
--------------------------------- 
|2  |Kitchenwork 
--------------------------------- 
|3  |Dogwalking 
--------------------------------- 


============== Required Result ==================== 
|username |sessioncount |amount_to_pay 
--------------------------------------------------- 
|Tom  |2    |120 
--------------------------------------------------- 
|Joe  |1    |45 
--------------------------------------------------- 

쿼리가 아래에있는 내 그리 성공적으로 접근하면 하나입니다

여기
SELECT 
tSessions.id, 
tSessions.userid, 
tSessions.typeid, 
tSessions.session_length_min, 
SUM(tUsers.rate_cleaning_30_min) AS rate_cleaning_30_min_sum, 
SUM(tUsers.rate_cleaning_45_min) AS rate_cleaning_45_min_sum, 
SUM(tUsers.rate_kitchenwork) AS rate_kitchenwork, 
SUM(tUsers.rate_dogwalking) AS rate_dogwalking, 
Count(*) AS sessioncount, 
FROM 
tSessions 
INNER JOIN tUsers ON tSessions.userid = tUsers.id 
WHERE WEEKOFYEAR(FROM_UNIXTIME(datetime))=WEEKOFYEAR(NOW())-1 
GROUP BY 
tSessions.userid, 
tSessions.typeid 
+0

나는 그와 비슷한 것을 시도했지만 성공하지는 못했다 : – Phil

+0

정확히 어디에서 문제가 발생 했는가? 예상되는 결과는 무엇입니까? – fancyPants

+0

나는 "필요한 결과"를 얻는 방법을 모릅니다. – Phil

답변

2

SQLFiddle example입니다 :

select tUsers.Name, 
count(*) as sessioncount, 
sum(
if(typeid=1, 
      if(session_length_min<=30,rate_cleaning_30_min, 
      rate_cleaning_45_min) 
      ,0) 
+ 
    if(typeid=2,rate_kitchenwork,0) 
+ 
if(typeid=3,rate_dogwalking,0) 
) as amount_to_pay 

from 
tSessions 
left join tUsers on tSessions.userid=tUsers.id 
group by tUsers.Name 

하지만 당신의 기본 방식은 좋지 않다. 작업 유형을 추가하거나 삭제해야하는 경우에는 어떻게해야합니까? 사용자와 작업 가격을 분리해야합니다. 그냥 tTypes를 새 테이블 그린 것이다을 추가하고 수정

-----------tTypes---------------- 
    |id  |name 
    --------------------------------- 
    |1  |Cleaning 30 min 
    --------------------------------- 
    |2  |Kitchenwork 
    --------------------------------- 
    |3  |Dogwalking 
    --------------------------------- 
    |4  |Cleaning 45 min 
    --------------------------------- 

-----------tSessions-------- 
|id  |userid |typeid | 
---------------------------- 
|1  |1  |1  | 
---------------------------- 
|2  |1  |4  | 
---------------------------- 
|3  |1  |2  | 
---------------------------- 
|4  |2  |2  | 
---------------------------- 


-----------tUsers----------------- 
|id  |name | 
----------------- 
|1  |Tom | 
----------------- 
|2  |Joe | 
----------------- 
|3  |Dave | 
----------------- 


and add tRates table with USER<->TASKS rates: 


-----------tRates-------- 
|id  |userid |typeid | rate | 
--------------------------------------- 
|1  |1  |1  |30  | 
-------------------------------------- 
|2  |1  |2  |40  | 
-------------------------------------- 
|3  |1  |3  |20  | 
-------------------------------------- 
|4  |1  |4  |50  | 
-------------------------------------- 
|5  |2  |1  |35  | 
-------------------------------------- 
|6  |2  |2  |45  | 
-------------------------------------- 
|7  |2  |3  |20  | 
-------------------------------------- 
|8  |2  |4  |60  | 
-------------------------------------- 
|9  |3  |1  |40  | 
-------------------------------------- 
|10  |3  |2  |30  | 
-------------------------------------- 
|11  |3  |3  |10  | 
-------------------------------------- 
|12  |3  |4  |60  | 
-------------------------------------- 
1


여기 문제가 데이터가 제대로 기록되지 않는 것입니다 생각합니다. , 문제는 여기에 속도 유형이,

 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Tom'),(SELECT id FROM ttypes WHERE NAME = 'Cleaning'),30); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Tom'),(SELECT id FROM ttypes WHERE NAME = 'Kitchenwork'),40); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Tom'),(SELECT id FROM ttypes WHERE NAME = 'Dogwalking'),20); 

INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Joe'),(SELECT id FROM ttypes WHERE NAME = 'Cleaning'),35); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Joe'),(SELECT id FROM ttypes WHERE NAME = 'Kitchenwork'),45); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Joe'),(SELECT id FROM ttypes WHERE NAME = 'Dogwalking'),20); 

INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Dave'),(SELECT id FROM ttypes WHERE NAME = 'Cleaning'),40); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Dave'),(SELECT id FROM ttypes WHERE NAME = 'Kitchenwork'),30); 
INSERT INTO trates VALUES (NULL,(SELECT id FROM tusers WHERE NAME = 'Dave'),(SELECT id FROM ttypes WHERE NAME = 'Dogwalking'),10); 


다음 :

 
CREATE TABLE `trates` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `type_id` int(11) NOT NULL, 
    `rate` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `unique` (`user_id`,`type_id`) 
)

인당 올바른 속도로 테이블을 채 웁니다 :
우선, 당신은 요금 테이블이 필요 작업 유형 + 작업 시간
클리닝 30 분
클리닝 45 분
이 두 가지 경우에만 청소가 가능하다는 의미입니까?
다른 작업을 30 분에서 45 분까지 수행 할 수 있습니까?
요금이 비율이 20 개 $ 시간당 경우 즉, 시간 당 보통과 사람이 120 분이 일, 그것은해야 TimeSpent/60 * PayPerHourRate (60분의 120 * 20)

항상 30 45 분의 경우 , 당신의 유형 테이블에 값을 추가 제안 :

id name 
1 Cleaning30m 
2 Kitchenwork 
3 Dogwalking 
4 Cleaning45m


데이터를 합산이 시점에서하는 것은 간단합니다 :)

0

즉 테이블 디자인에 약간의 문제가 있습니다 ... 당신이 경우 'tTypes'테이블에 행을 하나 더 추가하면 'tUsers'테이블에 하나의 열을 추가하십시오. 그건 좋은 디자인이 아닙니다.

나는 약간 'tUsers'테이블을 수정하고 '그린 것이다'

새로운 tUses 테이블 구조가

enter image description here

새로운 '그린 것이다'테이블 아래에 주어진 이름이 하나 개 이상의 테이블이

처럼 될 것입니다 추가

enter image description here

새 'trates'테이블을 만드는 스크립트는 아래와 같습니다.

CREATE TABLE `trates` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `typeid` INT(11) NOT NULL DEFAULT '0', 
    `userid` INT(11) NOT NULL DEFAULT '0', 
    `rate` INT(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=13; 

스크립트 '그린 것이다'테이블은 다음 방금 삽입해야 'tTypes'테이블에 또 하나 개의 유형을 추가하는 경우이 디자인의

INSERT INTO `trates` (`id`, `typeid`, `userid`, `rate`) VALUES 
    (1, 1, 1, 30), 
    (2, 2, 1, 50), 
    (3, 3, 1, 40), 
    (4, 4, 1, 20), 
    (5, 1, 2, 35), 
    (6, 2, 2, 60), 
    (7, 3, 2, 45), 
    (8, 4, 2, 20), 
    (9, 1, 3, 40), 
    (10, 2, 3, 60), 
    (11, 3, 3, 30), 
    (12, 3, 3, 10); 

장점 아래에 주어진다 당신에게 데이터를 삽입 'trates'테이블에서 한 행을 이전 테이블에 하나의 열을 만드는 대신.

나는 같은 'tSessions'와 'tTypes'테이블을 사용 ..

을 내 새 테이블을 생성 한 후에는 결과
select usr.name, (select count(distinct userid,typeid) 
from tsessions tsess where 
tsess.userid=usr.id) as 'sessioncount', sum(rate) as 'amount_to_pay' 
from tusers usr,trates rts,tsessions sess1 where rts.userid=usr.id 
    and rts.typeid=sess1.typeid and sess1.userid=usr.id 
group by usr.name 

enter image description here

sessioncount가

에게 필요한 얻을 쿼리를 사용할 수 있습니다 3 왜냐하면 나는 'tTypes'테이블에서 'cleaning_30_min'과 'cleaning_45_min'에 대해 별도의 행을 추가하기 때문에 Tom에 대해 3을 사용했습니다. 나는 3이이 경우에 정확한 세션 카운트라고 생각한다.