2012-01-27 6 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' 

мне нужно собрать данные, поэтому у меня есть, в то же время, Resultset с пользователями, счетчик счетов для каждого пользователя, суммы сумм для счетов для каждого пользователя, а также подсчета счетов для каждого пользователя, но только они имеют дату только на текущий год ...

Что-то вроде этого :

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

I удался получить первые 3 колонки с этим запросом:

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; 

Кроме того, я могу получить первые и последние столбцы с этим другим:

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 

(не помню всех деталей, но дело в том, что, например, 2 результаты для «Джона» в CountAcctsThisyear, получить дублируется тоже в результате, и все умножится ...)

  • пытался каждый запрос в качестве подзапроса: SELECT * FROM (первый запрос с u.id в качестве ufid также выбранного) AS-первых, (второй запрос с u.id, как USID также выбран) в качестве второго ГРУППА ПО 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

: Group 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: Я думал, что главной таблицей должно быть Счета и Внутреннее соединение. Поэтому пользователь должен присутствовать в таблице пользователя. Это позволит избежать дубликатов. И получится соответствующий результат. –

+0

Не работает для пользователей без учетных записей. Существует причина, по которой OP использовал LEFT JOIN для решения из 3 столбцов, который хорошо подходит для него. – piotrm

+0

Я рассматриваю, что пользователь будет иметь хотя бы учетную запись (строку) в таблице счетов. Так получится результат учета пользователей. Если это не требуется, необходимо принять левое соединение, и порядок таблиц изменится. –

Смежные вопросы