none
GROUP BYで括った場合のDRDER BYが適用されない

    質問

  • 環境 VS2010 SQLServer2008 VB ASP.NET4

    テーブル

    商品名    使用者数

    A        5

    B        6

    A        2

    B        3

    というテーブルがあるとして、

    SELECT TOP (100) PERCENT  商品名, SUM(使用者数) AS 使用者数計

    FROM dbo.tbl1

    GROUP BY 商品名

    ORDER BY 使用者数計 DESC

    という風にSQLを書いたのですが、意図したとおりになりません。

    やりたいこと:グループ化した商品を使用者数計で多い順に並び変えたい

    商品名    使用者数

    B        9

    A        7

    という風に

    有識者の方、お力添えをお願いいたします。


    2012年4月25日 3:36

回答

すべての返信

  • "TOP (100) PERCENT"を指定する必要があるのでしょうか?命名から察するにViewではなくTableのようですし。

    回答ではありませんが気になりました。


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    2012年4月25日 3:55
  • > という風にSQLを書いたのですが、意図したとおりになりません。

    意図したとおりにならずにどうなるのかを明示しましょう。

    2012年4月25日 4:30
  • 恐らくですが、

    SELECT TOP (100) PERCENT WK.*
      FROM
         (
           SELECT 商品名
                , SUM(使用者数) AS 使用者数計
             FROM dbo.tbl1
            GROUP BY 商品名
         ) AS WK
     ORDER BY 使用者数計 DESC

    とかでは?
    ※TOP句とGROUP BY句を同レベルで記載すると分かりづらいので、
      分けて書いた方が良いと思います。

    合わせて、
    SQL Server 2005以降はSELECT句で付けたエイリアスを
    同レベルのORDER BY句で指定出来なかった気がするのですが、
    提示されたSQLってエラーになりませんか?

    ※合わせて以降の話は忘れて下さい。思い違いでした。。。

    • 編集済み aviator__ 2012年4月25日 5:11
    2012年4月25日 4:52
  • という風にSQLを書いたのですが、意図したとおりになりません。

    掲載されているSQLで動くはずです。特に問題はありません。既に指摘が出ていますが、「TOP (100) PERCENT」は必須ではありません。
    それとも「意図したとおりになりません」は、動かないということでしょうか? であれば、SQL文に全角文字が含まれているのが原因だと思いますが、さすがにそれは気が付きますよね・・・?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年4月25日 5:07
  • 御返答ありがとうございます。

    早速ですが試してみました。

    しかし、グループ化した商品名において、商品名ごとに合計した使用者数の多い順にはなっていませんでした。

    グループ化もされ、それぞれの合計値も出ているのですが、結果を表示しても降順にはなっていないのです。

    なぜでしょうか?

    2012年4月25日 9:49
  • trapemiya様いつもお世話になっております。

    >SQL文に全角文字が含まれているのが原因だと思いますが、さすがにそれは気が付きますよね・・・?

    さすがにそれはないです。

    SQLは発行できて、結果は出ているのですが、降順になっていないのです。

    2012年4月25日 9:52
  • なんとなくSQLの問題ではなさそうな気がします。

    >>SQLは発行できて、結果は出ているのですが、降順になっていないのです。

    との事ですが、実行環境は何ですか?

    >>環境 VS2010 SQLServer2008 VB ASP.NET4

    とあるので、Webアプリ中でSQLを発行していると思われますが、
    だとしたらSQLで取得した後にソートしてしまっているという事は無いでしょうか。

    Managment Studio上で実行した結果の取得内容が降順になっていないのか、
    取得後に何かロジックを介した後のアプリ表示内容が降順になっていないのか・・・

    どちらでしょうか。

    2012年4月25日 10:09
  • ご返答ありがとうございます。

    はい、実行環境は、VS2010上のサーバーエクスプローラーで実行したビューの結果の取得内容です。

    アプリ自体にはまだなにもしておりませんので、単体での実行だと思うのですが・・・

    すみません

    • 回答としてマーク kazukazu2002 2012年4月26日 1:11
    • 回答としてマークされていない kazukazu2002 2012年4月26日 1:11
    2012年4月25日 11:16
  • ちょっと検索してみました。以下のようなことがあるようですね。

    ビューのソートについて
    http://ziddy.japan.zdnet.com/qa4420769.html?order=DESC&by=datetime


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kazukazu2002 2012年4月26日 1:11
    • 回答としてマークされていない kazukazu2002 2012年4月26日 3:06
    • 回答としてマーク kazukazu2002 2012年4月26日 4:04
    2012年4月26日 0:53
  • trapemiya様

    御返答ありがとうございます。

    早速試してみました。結果思い通りになりました。 書き方的に問題が無かったにも関わらず、裏技的なことになっているとは・・・

    解答としては

    SELECT TOP (1000)  商品名, SUM(使用者数) AS 使用者数計

    FROM dbo.tbl1

    GROUP BY 商品名

    ORDER BY 使用者数計 DESC

    これで、商品名を合計した使用者の多い順で並び替えることができました。

    ただ、問題があります。レコード全件が表示されてしまいますので、困っております。

    上位10件をこの状態で表示できればいいのですが・・・

    • 回答としてマーク kazukazu2002 2012年4月26日 1:11
    • 回答としてマークされていない kazukazu2002 2012年4月26日 3:06
    • 編集済み kazukazu2002 2012年4月26日 3:08
    2012年4月26日 1:11