объединение нескольких таблиц (одна подзапрос) - PullRequest
0 голосов
/ 27 января 2012

У меня есть (снова) эти таблицы:

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

Мне удалось получить первые 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;

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

У меня есть ... - попытался покинуть таблицу Accounts и подзапрос acctsthisyear с таблицей User (группировка по полю us.id), но все, что я получил, было примерно так:

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

(не могу вспомнить все детали, но дело в том, что, например, 2 результата для 'John' в CountAcctsThisyear тоже дублируются в результате, и все умножается ...)

  • пробовал каждый запрос как подзапрос: ВЫБРАТЬ ИЗ (первый запрос с u.id в качестве ufid также выбран) как первый, (второй запрос с u.id в качестве usid также выбран) Как второй 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, особенно по Joins: - /

Ответы [ 4 ]

2 голосов
/ 27 января 2012

попробуйте это:

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`
1 голос
/ 27 января 2012
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;
1 голос
/ 27 января 2012
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 голосов
/ 27 января 2012
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)

попробуйте это один раз !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...