2011-08-16 11 views
1

コンバインド合計でレコード数をカウント:私は寄付金を合わせた合計があるユーザーの数を取得するクエリを作成したいと思いますSQL - 私はこれに似たユーザーテーブル持って

| ID | DONATION | RANK | 
| 4 |  10 |  12 | 
| 9 |  20 |  8 | 
| 2 |  40 |  5 | 
| 3 |  80 |  2 | 

をランクによって順序付け100、...のような何かを言うよりも少ない(明らかに正しくない):

select count(*) where sum(donation) < 100 order by rank 

はそれも可能だ場合は、これを行う方法を見つけ出すことはできません。私はこれについて正しいことをやっていることさえ確信していません。任意のアイデアやポインター?

+0

ここでの目標は明確ではありません。問題は「寄付の合計額」です。つまり、ユーザーをある種の方法でグループ化する必要があります。ユーザー4と同様に、3は合計90の寄付を持つグループです。ユーザー4,9と2も合計70でグループ化できます。グループを作成する上でランクは決定要因ですか? – ace

+0

私は彼がドナーごとに(すなわちIDに基づいて)「寄付の合計を集計」を意味すると思いますか?次に、/ having節を使用してグループを作成してください。 – Jimmy

答えて

2

(、私は確かであることができなかった私は、ユーザーに自分のID列のポイントを考えると限り)あなたは以下の寄付テーブルを持っていると仮定すると:

| ID | UserId | Donation | 
| 1 | 1  | 60  | 
| 2 | 1  | 35  | 
| 3 | 2  | 70  | 
| 4 | 2  | 40  | 
| 5 | 3  | 90  | 


次のクエリはします彼らの合計寄付であなたのユーザーの数を与える

SELECT COUNT(1) 
FROM (
    SELECT UserId 
    FROM Donations 
    GROUP BY UserId 
    HAVING SUM(Donation) < 100 
) AS t 

追加情報に基づいて更新してください。
私はあなたが望むものを1つのSQLステートメントから得ることができるとは思わないが、あなたがしなければならないのは、(適切な順序で)必要なレコードをループしてIDを一時テーブルに挿入し、寄付の合計。合計が上限を超えたら、カーソルループを抜けて結果を返します。このようなもの:

CREATE PROCEDURE GetTopDontations(limit DECIMAL(...)) 
BEGIN 
    CREATE TEMPORARY TABLE t1 (
     id INT 
    ); 

    DECLARE total, Donation DECIMAL(...); 
    DECLARE Id INT; 
    DECLARE curDonations CURSOR FOR SELECT ID, Dontaion FROM Donations ORDER BY <something relevant>; 

    SET total = 0.0; 
    OPEN curDonations; 
    read_loop: LOOP 
     FETCH curDonations INTO Id, Donation; 
     INSERT INTO t1(id) VALUES (Id); 
     SET total = total + Donation; 
     IF(total > limit) THEN 
      LEAVE read_loop; 
     END IF; 
    END LOOP: 
    CLOSE curDonations; 

    SELECT d.* 
    FROM Donations d 
     INNER JOIN t1 
      ON d.Id = t1.Id; 
END; 
+0

これは近いですが、ユーザーごとに1つのレコードしかありません。私は本質的にいくつかの簡単な統計情報を取得しようとしています...ランク順に、寄付などの最初の$ 100を構成するユーザーの最初のサブセット(読み込み回数)を探します。 – Nigel

+1

あなたはたぶん1つのSQLステートメントしかし、Donationの合計が<100である間にカーソルを使用することができます。一時テーブルにidを入れて、tempテーブルにあるすべての寄付を選択するだけです。 – Scott

+0

ありがとう! – Nigel

6

集計関数(SUMなど)でフィルタリングする場合は、列または式でのみ機能しますが、HAVINGを使用する必要があります。たとえば:

SELECT COUNT(*) 
    FROM your_table 
    HAVING SUM(donation) < 100 

このクエリは、本当に有効なGROUP BYなしでは意味がありませんが、あなたはポイントを得る:集約関数をフィルタリングするためにHAVINGを使用します。技術的には、ユーザーIDごとにグループ化し、カウントを行い、カウントを合計する必要があります。

0
SELECT id, sum(donation) AS totalDonation 
FROM TableName 
GROUP BY id 
HAVING totalDonation < 100 
関連する問題