2012-01-27 4 views
0

に参加し、このテーブル:複数のテーブル(1サブクエリである)私は(再び)は

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 

I

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; 

しかし、ここでの問題はだ、私はできません:

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; 

また、私は、この他の1で最初と最後の列を取得することができます:このクエリで最初の3列を取得するために管理しますこのような方法でこの2つのクエリを使用して、私が期待している最終的な結果を得ることができます...

私は... - アカウントテーブルとacctsthisyearサブクエリをUserテーブル(グループ化us.idフィールドで)、私が得るのは次のようなものです:

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

(すべての詳細を覚えていますが、事は、たとえば、CountAcctsThisyearの「ジョン」の2つの結果は、結果にあまりにも重複取得し、すべてを掛けます、ということであることはできません... )

  • サブクエリとして各クエリを試みた:第 とも選択USIDとしてu.idと同様に第一、 (第2クエリ))UFIDも選択さu.idと (最初のクエリから SELECT * 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

@ベンジャム:私はメインテーブルがアカウントであるべきだと思っていて、内部結合が必要です。したがって、ユーザーはUserテーブルに表示する必要があります。重複を避けることができます。適切な結果が得られます。 –

+0

アカウントを持たないユーザーには失敗します。彼のためにうまくいく3列の解決策のためにOPがLEFT JOINを使用した理由があります。 – piotrm

+0

私は、ユーザーがアカウントテーブル内で少なくともアカウント(行)を持っていると考えています。それで、アカウントを持つユーザーの結果が得られます。これが必須でない場合は、左結合を行い、表の順序が変更されます。 –

関連する問題