2

私は 2 つのテーブルを持っており、特定の「ID」が発生する回数を数え、その「ID」に対応する名前を出力しようとしています。たとえば、リスト内の特定の人に複数の ID があり、ID が 4 回以上発生する人を出力したいとします。

bvr のおかげで、その一部を取得できました。次のステートメントを使用して、4 回以上発生する値を表示する方法を理解しました。

SELECT ID , COUNT(OrderID) FROM Table1
GROUP BY ID
HAVING COUNT(OrderID) > 4

2番目の部分が必要です。

2 つのテーブルの例を次に示します。

表1

ID | OrderID
--------------
191 | 1020
150 | 1090
191 | 1023
140 | 1033
191 | 2132
191 | 1233
191 | 1321

表 2

ID | FirstName
--------------
191 | Mat
150 | Stewart
191 | Mat
140 | John
191 | Mat
191 | Mat
191 | Mat

このようなものを出力したい

Occurrences  | FirstName 
-------------------------
         5   |  Mat
4

2 に答える 2

1

名前を取得するために 2 番目のテーブルに結合します。

SELECT t1.ID , COUNT(t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     (select id, min(name) as name
      from Table2 t2
      group by id
     ) t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(t1.OrderID) > 4;

ただし、結合を行う前に、id重複がないことを確認するために集計する必要があります。サブクエリは、 の最小名を取得しますid。すべての名前が同じ場合は、これが名前になります。それ以外の場合は、に割り当てられた任意の名前idです。

編集:

サブクエリなしでクエリを実行できますが、より効率的かどうかはわかりません。

SELECT t1.ID , COUNT(distinct t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     Table2 t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(distinct t1.OrderID) > 4;

これは単純に見えるかもしれませんが、パフォーマンスの点でははるかに悪い場合があります。たとえば、テーブル 1 とテーブル 2 の両方で 1 つの ID に 1000 件の一致があった場合、その ID は、結合後に処理する 1,000,000 行になります。

于 2013-08-15T00:54:52.163 に答える
0

付きのバージョンDISTINCT

SELECT t2.FirstName, COUNT(*) Occurrences 
  FROM Table1 t1 JOIN 
(
  SELECT DISTINCT id, firstname
    FROM Table2
) t2
    ON t1.ID = t2.ID
 GROUP BY t2.ID, t2.FirstName
 HAVING COUNT(*) > 4

出力:

| | ファーストネーム | オカレンス |
---------------------------
| | マット | 5 |

これがSQLFiddleのデモです

于 2013-08-15T00:54:55.007 に答える