0

クリーンアップしようとしているテーブルがあるので、それぞれのテーブルの最初のアドレスが必要ですClientId

テーブルAddressesにはこれらの列があります

Pk[Id]
[ClientId]
[AddressLine1]
[AddressLine2]

私が使用するクエリ:

SELECT *
FROM Addresses
ORDER BY ClientId

結果 =

1   1   foo     bar
2   1   foo2    bar2
3   1   foo3    bar3
4   1   foo4    bar4
5   2   foo     bar2
95  2   foo     bar5
97  2   foo     bar6
8   3   foo2    bar7

必要な結果 =

1   1   foo     bar   <--is first match for clientid = 1
5   2   foo     bar2  <-- is first match for clientid = 2
8   3   foo2    bar7  <-- is first match for clientid = 3

これは n clientids で機能する必要があります

私は試した

SELECT *
FROM Addresses
GROUP BY ClientId

結果のエラーは次のとおりです (列 'Id' は、集計関数または GROUP BY 句のいずれにも含まれていないため、選択リストでは無効です。)

ここで何が欠けていますか?

4

4 に答える 4

2

SQL Server では、GROUP BY を使用する場合、選択リストの列に対して集計関数を使用するか、それらを GROUP BY に追加する必要があります。

元のクエリは、次を使用するように変更できます。

select a.id, a.clientid, a.address1, a.address2
from addresses a
inner join
(
    select clientid, MIN(id) id
    from addresses
    group by clientid
) d
    on a.clientid = d.clientid
    and a.id = d.id;

ご覧のとおり、これはmin(id)for eachを返すサブクエリを使用しておりclientId、これはclientid. 次に、これをテーブルに結合して、各クライアントの最小 ID を持つ行のみを返します。

于 2013-06-20T16:17:33.540 に答える
1

SELECT * を実行しました。選択リストのすべてのフィールドは、GROUP BY 句または集計関数 (MAX、MIN、SUM、AVG など) 内にある必要があります。

これはエラーを説明しています。問題を解決する SQL については、Goat_CO の回答を参照してください。

于 2013-06-20T16:15:15.553 に答える
0

単一値ルールに従って: 選択リスト内のすべての列は明示的に GROUP BY 条件の一部であるか、集計関数 (COUNT()、MAX() など) 内に含まれている必要があります。

于 2013-06-20T16:15:40.563 に答える