2012-01-27 2 views
0

내가 가지고있는 (다시)이 테이블에 가입 : 나는 데이터를 수집 할 필요가 그래서이여러 테이블 (하나는 하위 쿼리입니다)

User: 
id | name 
------------- 
1 | 'John' 
2 | 'Peter' 
3 | 'Luke' 

Accounts: 
id | userid | amount | date 
-------------------------- 
1 | 1  | 1000 | '2012-01-26' 
2 | 1  | 2000 | '2011-12-25' 
3 | 1  | 1000 | '2012-01-25' 
4 | 2  | 1500 | '2012-01-15' 
5 | 3  | 2500 | '2011-11-30' 

, 동시에, 사용자와 결과 집합, 수를 각 사용자의 계정 금액 합계, 각 사용자의 계정 수 합계 및 현재 사용자의 계정 수 합계 ...

:

Some-query: 
UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 3   | 4000  | 2 
'Peter' | 1   | 1500  | 1 
'Luke' | 1   | 2500  | 0 

나는이 다른 하나를 사용하여 첫 번째와 마지막 열을 얻을 수 있습니다, 또한

SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts 
FROM User u 
LEFT JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id; 

:이 쿼리로 처음 3 열을 얻기 위해 관리 문제는 여기있어,

SELECT u.name as Username, 
     COUNT(acctsthisyear.id) as CountAcctsThisYear 
FROM User u 
LEFT JOIN (SELECT a.id 
      FROM Accounts a 
      WHERE DATE_FORMAT(a.date,'%Y') = DATE_FORMAT(CURDATE(),'%Y') 
     ) AS acctsthisyear ON u.id = acctsthisyear.userid 
GROUP BY u.id; 

을하지만, 그럴 수 없어 그런 식으로이 두 가지 쿼리를 사용하여 예상 한 최종 결과를 얻을 수 있습니다. ...

저는 ... - 사용자 테이블 (계정 테이블과 acctsthisyear 하위 쿼리를 그룹화하려고했습니다. us.id 필드에 의해), 그러나 내가 얻는 것은 이것과 같은 것이다 :

UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 6   | 6000  | 6 
'Peter' | 1   | 1500  | 1 
'Luke' | 0   | 0  | 0 

는 (모든 세부 사항을 기억하지 수 있지만 것은 예를 들어, CountAcctsThisyear에서 '존'에 대한 2 개 결과가 결과에 너무 중복 얻고, 모두 곱한 도착한다는 것입니다 ... USID 또한 선택된으로 초로) AS 제) u.id와 (제 쿼리 FROM SELECT * (ufid 또한 선택된으로 u.id와 제 쿼리)

  • 가 부질 각 쿼리를 시도 GROUP BY ufid, usid

과 같은 것을 가지고 :

UserName | CountAccts | SumAccts | CountAcctsThisYear 
----------------------------------------------------- 
'John' | 3   | 4000  | 2 
'Peter' | 1   | 1500  | 2 
'Luke' | 1   | 2500  | 2 
'John' | 3   | 4000  | 1 
'Peter' | 1   | 1500  | 1 
'Luke' | 1   | 2500  | 1 
'John' | 3   | 4000  | 0 
'Peter' | 1   | 1500  | 0 
'Luke' | 1   | 2500  | 0 

을 (내가 요소에 의해 그룹을 반전하면, 내가 얻을 모두 동일한하지만 ... 다른 순서로 그룹화입니다)

어떤 방법 ... 그게 ... 내가 찾고있는 것을 성취하기위한 올바른 방법이 무엇인지에 대한 아이디어가 있습니까? 난 정말 SQL에 대한 전문가는 아니지만 이후 특별히에 합류, 그것은 정말 실망이야 : -/

답변

2

이 시도 :

SELECT u.`Name` as UserName, 
     Count(*) as CountAccts, 
     SUM(a.`amount`) as SumAccts, 
     COALESCE(iTable.CountAcctsThisYear, 0) as CountAcctsThisYear 
FROM `User` u INNER JOIN `Accounts` a 
        ON u.`ID` = a`.`ID` 
       LEFT JOIN 
        (SELECT `ID`, Count(*) as CountAcctsThisYear 
        FROM `Accounts` 
        WHERE DATE_FORMAT(`date`,'%Y') = DATE_FORMAT(CURDATE(),'%Y') 
        GROUP BY `ID`) as iTable 
       ON `User`.`ID` = iTable.`ID` 
GROUP BY `User`.`Name` 
+0

감사합니다! 나는 진짜 데이터가 더 많은 조건을 가지고 있기 때문에 나는 여전히 테스트하고있다. 그러나 필수적인 부분은 내가 게시 한 것 ... 바로 지금, 그것은 정답으로 보인다, 나는 시험을 마치 자마자 너에게 말할 것이다! –

+0

그래서 그게 다야, 또 고마워! –

0
SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts 
FROM User u 
INNER JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id,YEAR(a.date) 

한 번이 시도!

1
SELECT u.name as Username, 
     COUNT(a.id) as CountAccts, 
     SUM(a.amount) as SumAccts, 
     SUM(CASE WHEN YEAR(a.date) = YEAR(CURDATE()) THEN 1 ELSE 0 END) 
      as CountAcctsThisYear 
FROM User u 
LEFT JOIN Accounts a ON u.id = a.userid 
GROUP BY u.id; 
+0

: 그룹 By by a.userid –

+0

u.id가 배수가 아닌 테이블에서 u.id로 어떻게 그룹화 할 수 있습니까? 그것은 독특합니다. 나는 그룹이 a.userid에 있어야한다고 생각한다. 테스트 해 봤니? –

+0

a.userid는 u와 동일합니다.id, 우리는이 조건에 가입합니다. – piotrm

1
SELECT u.name as Username, 
     COUNT(a.userid) as CountAccts, 
     SUM(a.amount) as SumAccts, 
     SUM(CASE WHEN YEAR(a.date) = YEAR(CURDATE()) THEN 1 ELSE 0 END) 
      as CountAcctsThisYear 
FROM Accounts a 
INNER JOIN User u ON u.id = a.userid 
GROUP BY a.userid; 
+0

@Benjam : 메인 테이블이 계정이어야하고 내부 조인이 필요하다고 생각했습니다. 따라서 사용자는 User 테이블에 나타나야합니다. 중복을 피할 것입니다. 그리고 적절한 결과를 얻을 것입니다. –

+0

계정이없는 사용자에게는 실패합니다. OP가 그를 위해 잘 작동하는 3 열 솔루션에 LEFT JOIN을 사용한 이유가 있습니다. – piotrm

+0

사용자가 적어도 계정 테이블의 계정 (행)을 보유하고 있다고 생각합니다. 그래서 계정을 가진 사용자의 결과를 얻을 것이다. 이것이 필요하지 않은 경우 왼쪽 결합을 수행해야하며 테이블 순서가 변경됩니다. –

관련 문제