1

私はこのようなテーブルを持っています:(Personal_IDは一意ですが、名前は一意ではなく、繰り返すことができることに注意してください)。

ID    SourceID     Personal_ID     Name     NumberOfPurchases 
1      4            1001           Alex           10
2      2            1002           Sara            5
3      4            1001           Alex            12
4      1            1003           Mina            200
5      2            1002           Sara            20  
6      2            1001           Alex            64

ここで行う必要があるのは、指定されたSourceIDに基づいて各人が行った購入数の合計を取得することです。そのため、次のような結果が得られsourceId = 4 ます。

        Name        Total Number of Purchases
 1.     Alex                 22

そしてSourceID=2の場合

        Name        Total Number of Purchases
1.      Alex                 64
2.      Sara                 25

このために私はこのようなものを思いついた:

SELECT Name,Sum(NumberOfPurchases) AS Total
FROM    tblTEST
GROUP BY (Personal_ID)
HAVING (SOURCEID = @id)

しかし、これは明らかに間違っています。ここで立ち往生しています。他のフィールドを追加するgroup-by clauseと結果が完全に異なり、追加しないと、このselectコマンドは機能しません。どうすればそのような結果を達成できますか?

4

3 に答える 3

1

ここでの問題はNameSELECT句に含まれていることだと思いますが、グループ化していますPersonal_ID。句にName明示的に追加すると役立つ場合があります。GROUP BYすべてが順調であれば、とにかくName機能的に決定されます。Personal_ID

また、 Luceroが言うように、SourceIDのWHERE句にフィルターを設定する必要があります。したがって、クエリは次のようになります。

SELECT   Name
         ,Sum(NumberOfPurchases) AS Total
FROM     tblTEST
WHERE    SOURCEID = @id
GROUP BY Personal_ID, Name;

このフィドルをチェックしてください。

明確にするために:のような集計関数を使用する場合、句内の他のSUM()すべてのものも句内にある必要があります。ただし、あなたの場合は一意ではないため、でのみグループ化することは望ましくありません。それがあなたがあなたの条項にの両方を持っている理由です。にがない場合、クエリは実行されません。そして、すべてのサラが大きなサラグループに入れられるのではなく、に従ってグループ化されるようにするために追加しています。SELECTGROUP BYNamePersonal_ID NameGROUP BYNameGROUP BYPersonal_IDPersonal_ID

于 2013-02-19T11:10:57.043 に答える
1

あなたはこれで試すことができます:

SELECT  names.Name
        , names.Personal_ID
        , grouped.Total
FROM    (
            SELECT  SourceID
                    , Personal_ID
                    , SUM(NumberOfPurchases) AS Total
            FROM    tblTEST
            GROUP BY 
                    SourceID, Personal_ID
) grouped
JOIN    (

        SELECT  DISTINCT
                Personal_ID
                , Name
        FROM    tblTEST
) names ON      names.Personal_ID = grouped.Personal_ID
WHERE           SourceID = @id

これがSQLフィドルです

Nameテストデータの中に、「Alex」という名前の人物を含む別のレコードを追加しました。同じ名前の人物が2人います。これは、列が一意ではないため、グループ化を実行できないことを示しています。Personal_IDまた、同じ名前の人を区別できるように、選択リストに追加しました。

于 2013-02-19T11:11:20.867 に答える
1

このようなもの?

SELECT Name, SUM(NumberOfPurchases) AS Total
FROM tblTEST
WHERE (SourceID = @id)
GROUP BY Name

注:グループ化WHEREのフィルターとグループ化のフィルター。HAVING

于 2013-02-19T11:04:24.193 に答える