22

私は現在、次のようなテーブルを持っています。

+------+-------+------------+------------+
| id   | rate  | first_name | last_name  |
+------+-------+------------+------------+

私がする必要があるのSUMは、レート列のを取得することですが、名前ごとに1回だけです。たとえば、John Doeという名前の3つの行があり、それぞれのレートは8です。SUMこれらの行の行は24ではなく8である必要があるため、名前のグループごとに1回レートがカウントされます。

SUM(DISTINCT last_name, first_name)もちろん、名前ではなくレート列を合計しようとしているため、機能しません。個々のレコードを数えるときに使用できることはわかっています。COUNT(DISTINCT last_name, first_name)これは、から取得しようとしている動作のタイプですSUM

SUM名前ごとに1つのレートを取得するにはどうすればよいですか?

前もって感謝します!

4

8 に答える 8

13
select sum (rate)
from yourTable
group by first_name, last_name

編集

これらの小さな「」のすべての合計を取得したい場合はsums、すべてのテーブルの合計を取得します。

Select sum(rate) from YourTable

ただし、何らかの理由で(whereたとえば、を使用する場合)異なり、上記の選択の合計が必要な場合は、実行してください。

select sum(SumGrouped) from 
(    select sum (rate) as 'SumGrouped'
    from yourTable
    group by first_name, last_name) T1
于 2012-08-02T17:03:32.040 に答える
7

デビッドは彼がそのように彼の答えを見つけたと言いました:

SELECT SUM(rate) FROM (SELECT * FROM records GROUP BY last_name, first_name) T1

ただしGROUP BY、内部クエリでを実行する場合は、で集計関数を使用する必要があると思いますSELECT。だから、答えはもっと似ていると思います:

SELECT SUM(rate) FROM (SELECT MAX(rate) AS rate FROM records GROUP BY last_name, first_name) T1

MAX()「last_name、first_name」の組み合わせに対して1つの「rate」のみを選択することを選択しましたが、MIN()「last_name、first_name」がテーブルで複数回発生した場合でも常に同じ「rate」につながると仮定すると、同じように機能するはずです。これは、Davidの当初の仮定のようです。一意の名前の場合、同じになることがわかっているため、レートを1回だけ取得する必要があります。

于 2015-06-22T22:26:03.820 に答える
6

これを行うには、合計する値を明確にします。これは可能ですが、非常に醜いです。

まず、ハッシュを使用して文字列を数値に変換できます。以下のSQLは、名前と名前のMD5​​ハッシュを実行します。これは32桁の16進数を返します。SUBSTRINGはこれらの最初の8つを取り、CONVはそれを10桁の数字に変換します(理論的にはこれが一意ではない可能性があります)。

CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)

次に、それを非常に大きな数で割って、レートに追加します。最終的には8.0000019351087950のようなレートになります。MySQLが小数点以下を切り捨てないようにするには、FORMATを使用する必要があります。このレートは、名前と名前ごとに一意になります。

FORMAT(rate + CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)/1000000000000000, 16)

そして、SUM DISTINCTを実行すると、8が1回だけカウントされます。次に、余分な小数点以下の桁数を取り除くために、結果をFLOORする必要があります。

FLOOR(SUM(DISTINCT FORMAT(rate + CONV(SUBSTRING(MD5(CONCAT(first_name,last_name)), 1, 8), 16, 10)/1000000000000000, 16)))

いくつかのテーブルを結合してグループ化するはるかに複雑なクエリを実行しているときに、このアプローチを見つけました。かなりひどいので使うかどうかはまだわかりませんが、うまくいきます。また、質問に答えた人にとって役に立たないのは6年遅すぎます。

于 2019-03-13T16:47:05.057 に答える
2
SELECT SUM(rate)
FROM [TABLE] 
GROUP BY first_name, last_name;
于 2012-08-02T17:12:30.410 に答える
1
SELECT SUM(rate)
FROM [TABLE] 
GROUP BY CONCAT_WS(' ', first_name, last_name);
于 2012-08-02T17:01:51.920 に答える
1

最近、私は同様の問題に遭遇しましたが、別の目的のためにすでにGROUPBY句があったことを除いて。次に例を示します。

SELECT r.name, SUM(r.rate), MIN(e.created_at)
FROM Rates r LEFT JOIN Events e ON r.id = e.rate_id
GROUP BY r.id

ここでの問題は、JOIN with Eventが原因でSUM(r.rate)、複数のイベントを持つエントリの重複が合計されることです。私の場合、クエリはもっと​​複雑だったので、余分なサブクエリを避けたかったのです。幸いなことに、エレガントな解決策があります。

SELECT r.name, SUM(r.rate) / GREATEST(COUNT(DISTINCT e.event_id), 1), MIN(e.created_at)
FROM Rates r LEFT JOIN Events e ON r.id = e.rate_id
GROUP BY r.id

GREATEST関数は、イベントのないエントリのゼロによる除算を防ぐために使用されます。整数を合計する場合は、合計をINTにキャストすることもできます。

于 2022-01-21T17:26:26.040 に答える
0

集計関数を使用せずにgroupby句を使用すると、グループ化条件ごとに不確定な1つのレコードが返されるため、上記のコードサンプルのいずれかを使用できます。詳細については、 http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.htmlリンクを参照してください。

于 2012-08-02T17:46:31.917 に答える
0

私はこのスレッドが私の解決策へのより良い方法を探しているのを見つけました、しかし私はまだより良いものを見つけませんでした:

SELECT SUM(rate) FROM (SELECT DISTINCT rate, first_name, last_name) Q
于 2021-04-30T07:12:18.103 に答える