2016-07-03 4 views
3

は、だから私は、このSQLを持っています。アウトの順序をカスタマイズする方法ですので、の代わりに:受注・ユニオンクエリ

ChildsName | MembershipType | TotalPoints 
========================================= 
Jon Snow | Intermediate | 48 
HODOR  | Intermediate | 67 
Cersei  | Intermediate | 789 
Ned Stark | Junior   | 5 
Daenerys | Junior   | 16 
Bran Stark | Junior   | 456 
Arya Stark | Senior   | 15 
Rob Stark | Senior   | 69 
Tyrion  | Senior   | 6215 

それが表示されます。

ChildsName | MembershipType | TotalPoints 
========================================= 
Arya Stark | Senior   | 15 
Rob Stark | Senior   | 69 
Tyrion  | Senior   | 6215 
Jon Snow | Intermediate | 48 
HODOR  | Intermediate | 67 
Cersei  | Intermediate | 789 
Ned Stark | Junior   | 5 
Daenerys | Junior   | 16 
Bran Stark | Junior   | 456 

どのように私は上記のコードでこれを行うことができますか?

+0

Awwww!関連するサブクエリを使用して以前に関連する質問がトップ3を選択しました(http://stackoverflow.com/questions/38155751/top-3-values-per-group-query-ms-access)? – Parfait

+0

Nah xDだから、いくつかのクエリをまとめて、うまくいきましたが、今は結果をソートしたいだけです。 – user6402722

+0

しかし、私はそれがうまく動作することを保証します。ちょうどそれをテストした。単純に、列名が正しいことを確認し、等号よりも小さいものを等号よりも小さいものに変更します(結びつきの場合は、等号を調整します)。再検討してください。これは、DRYerソリューション(繰り返しはしません)として、このユニオンクエリバージョンよりも優れています。 – Parfait

答えて

1

結果をサブクエリでラップして注文しました。 membershipTypeでグループ化して注文するために、各メンバーシップタイプのランクを設定しました。 私はこれが役立つことを願っています:

SELECT * FROM (
    SELECT TOP 3 Members.ChildsName AS ChildsName, Members.MembershipType AS MembershipType, Results.TotalPoints AS TotalPoints, 1 AS rank 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE (((Members.MembershipType)="Senior")) 
    ORDER BY Results.TotalPoints 

    UNION ALL 

    SELECT TOP 3 Members.ChildsName AS ChildsName, Members.MembershipType AS MembershipType, Results.TotalPoints AS TotalPoints, 2 AS rank 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE (((Members.MembershipType)="Intermediate")) 
    ORDER BY Results.TotalPoints 

    UNION ALL 

    SELECT TOP 3 Members.ChildsName AS ChildsName, Members.MembershipType AS MembershipType, Results.TotalPoints AS TotalPoints, 3 AS rank 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE (((Members.MembershipType)="Junior")) 
    ORDER BY Results.TotalPoints 
) m 
ORDER BY m.rank, m.ChildsName, m.TotalPoints; 
+0

msアクセス権がありますが、m。*を削除して* FROMに置き換えて動作しますが、それは各カテゴリからトップ3を上げないという事実以外は機能します。これを引き起こす原因は何ですか? – user6402722

+0

ええ、私はそれを持っています...私たちは内側の順序を取り除いたので、トップ3を選択するための 'TotalPoints'は考慮していません。 – Vimlesh

0
Select * From (SELECT TOP 3 
Members.ChildsName, Members.MembershipType, 
Results.TotalPoints FROM Members INNER JOIN Results ON Members. 
[Member ID] = Results.ID 
WHERE (((Members.MembershipType)="Senior")) 
ORDER BY Members.MembershipType, 
Results.TotalPoints 
UNION SELECT TOP 3 Members.ChildsName, Members.MembershipType, 
Results.TotalPoints FROM Members 
INNER JOIN Results ON Members. 
[Member ID] = Results.ID WHERE 
(((Members.MembershipType)="Intermediate")) ORDER BY Members.MembershipType, 
Results.TotalPoints UNION SELECT TOP 3 Members.ChildsName, 
Members.MembershipType, Results.TotalPoints FROM Members INNER JOIN Results ON Members. 
[Member ID] = Results.ID WHERE (((Members.MembershipType)="Junior")) ORDER BY 
Members.MembershipType, Results.TotalPoints) 
as myQuery order by 2 desc; 
+0

申し訳ありませんが、私はアンドロイドアプリを使用していますので、私は正しいアイデンティティを与えるのが難しいです – Dazak

+0

とにかくテーブルの中央に中間を置くことはありますか?アルファベット順に降順にソートして、それを逆さまにするだけです。「シニア、中級、ジュニア」にしたいのです。しかし、速い返信のおかげで – user6402722

+0

これだけでなく、これはポイントの順番を変更します。これはメンバーシップタイプでグループ化された1st 2nd 3rdオーダーになりたいものです。 – user6402722

1

はこれを試してみてください:

 
SELECT * 
FROM 
(
    SELECT TOP 3 Members.ChildsName, Members.MembershipType, Results.TotalPoints, 0 AS MembershipTypeOrder 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE Members.MembershipType='Senior' 
    ORDER BY Results.TotalPoints 
    UNION 
    SELECT TOP 3 Members.ChildsName, Members.MembershipType, Results.TotalPoints, 1 AS MembershipTypeOrder 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE Members.MembershipType)='Intermediate' 
    ORDER BY Results.TotalPoints 
    UNION 
    SELECT TOP 3 Members.ChildsName, Members.MembershipType, Results.TotalPoints, 2 AS MembershipTypeOrder 
    FROM Members INNER JOIN Results ON Members.[Member ID] = Results.ID 
    WHERE Members.MembershipType='Junior' 
    ORDER BY Results.TotalPoints 
) ResultSet 
ORDER BY ResultSet.MembershipTypeOrder, ResultSet.TotalPoints; 

また、あなたは別のテーブルにメンバーシップのタイプを格納することができます。たとえば、

 
MembershipTypeID | Name   | Order 
========================================= 
1    | Intermediate | 1 
2    | Junior   | 2 
3    | Senior   | 0 

次に、INNER JOINを使用してメンバーシップタイプ名とリストの順序を取得できます。