• ベストアンサー

SQLServerのGROUP BYについて

SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

質問者が選んだベストアンサー

  • ベストアンサー
  • x-1919
  • ベストアンサー率52% (91/173)
回答No.1

SQL Server 2000 は持ってないけど、'△△1' と '△1' は区別されたと思いますよ。 後ろの空白文字が無視されて他と思います。 '1' '△1' '△△1' '1△' '1△△' これを GROUP BY すると '1' '△1' '△△1' てな感じに

aikibon
質問者

お礼

回答ありがとうございます。 私が悩んでいたのは、この現象です。 おかげさまで納得できました。

その他の回答 (1)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

GROUP BYを行う項目の型はなんでしょう? char(3) ’1△△’と’1△’は同じ (’1△’を格納していても、’1△△’となるため) varchar(3) ※Oracleではvarchar(3) ’1△△’と’1△’は別 ※ ’△△1’と’1△’が同じとみなされる? ⇒暗黙の型変換がされてしまって数値に変換されている気がします。。。 SQL Server2000で試す環境がないので、はっきりしたことはわかりませんが。 ・・・項目としているけど実はConvert関数を使っている関数式とかならかなりあやしい。

aikibon
質問者

お礼

お礼が遅くなって申し訳ありません。 ’1△△’と’1△’は同じ (’1△’を格納していても、’1△△’となるため) 私が悩んでいた現象はこれです。 質問が間違っていました。 おかげでたすかりました。ありがとうございます。

関連するQ&A

  • GROUP BY , MAX の使用法に関して

    いつもお世話になります。 GROUP BY , MAX の使用法に関して質問です。 USERCDとKYOUTUNOでグルーピングをしてSEQの最大値のレコードを抽出しようとしています。 以下のようなSQL文の場合ですとBIKOUがないレコードを抽出する事が出来るかと思います。 【select USERCD , KYOUTUNO , MAX(SEQ) from テーブル1 group by USERCD , KYOUTUNO】 そこで、BIKOU も同時に抽出したいのですが、BIKOUを選択列に入れると「GROUP BYの式ではありません。」のエラーが出ます。 「そりゃそうだ」だと思うのですが、どうのようにすればSQL文を作れば結果のようなレコードを抽出出来るのでしょうか? よろしくお願いします。 ◆テーブル1のデータ USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 1 あああああ 100 100 2 いいいいい 100 100 3 あいうえお 222 200 1 AAAAA 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 1 ううううう 44444 100 2 えええ ◆結果 USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 3 あいうえお 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 2 えええ ■ORACLEのバージョン  Oracle9i

  • GROUP BYを使ったSELECT文の総件数を求める方法

    【表A】 列1 | 列2  ----------- 山田 | A 山田 | A 田中 | A 田中 | B 田中 | C 木村 | A 木村 | A 木村 | B 上記で列1・列2をグループ化した件数を求めたいのですが、Oracleだと   SELECT COUNT(*) FROM (SELECT 列1,列2 FROM 表A GROUP BY 列1,列2) というSQL文で結果「6」が出力されますが、SQLServerではエラーとなってしまいます。 SQLServerで実現したい場合はどのように記述すればよろしいでしょうか?

  • SQLServerでの副問合せについて

    いつもお世話になります。 当方SQLServerをあまり使った事がなくSQLの組み方で少々てこずっております。そこでちょっとお知恵をお借りしたく質問致しました。 処理内容としましては、ある条件でテーブル内のデータを削除するって事なんですが、オラクルで記述するなら DELETE FROM AAAA WHERE (あああ,いいい) IN (SELECT あああ,いいい FROM BBBB GROUP BY あああ,いいい)  となるのですが、この構文をSQLServerで記述すると構文エラーとなってしまいます。 まあこの構文が実際には使えて私の記述がおかしいだけのかもしれないのですが、もし使えないのであればどのように記述すればよいのでしょうか? 申し訳ありませんが、宜しくお願いします。 ちなみにSQLServerは2000を使用しております。

  • Oracleから見たOracleの優位性(SQLServerとの比較)

    OracleとSQLServerを比較したとき、Oracleが優れている点ってどんなところだと思いますか? また開発でOracleとSQLServerどちらかを提案するとき、どういった切り分けで2つを使い分けますか? 私が思うOracleの優位性は ・行ロックが確実 ・RowIDの存在 ・データが大容量でも比較的早い ・細かくチューニングができる です。 またOracleかSQLServerかのどちらかの選択で、私が自由に提案できるとしたら、行ロックがほとんど必要ない&データ件数が数万~数十万程度ならSQLServer、行ロックが頻繁に必要&データ件数が数十万以上ならOracleを提案します。 ちなみに私のDBを使った開発歴は、Access1年程度、SQLServer1年程度、Oracle4年程度です。 よろしければ、みなさんのDBを使った開発歴も教えてください。

  • sqlserverにはグループ集計のfirstとlastがありません??

    accessユーザーです sqlserverに組み替えているなかでaccessでは今までグループ集計をクエリーで作成していました select first(フィールド1) as AA,last(フィールド2) as BB  from FFテーブル group by フィールド3 ところがsqlserverにはfirstとlastがありません?? どのようにすればよいのかご教授おねがいします firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。 よろしくおねがいします

  • SQLServerでの書き方

    二つのテーブルをマージした後に、時間毎の平均値を取得したいのですが SQLServerではどのように書けばよろしいでしょうか? oracleだと↓こんな感じ select ti , avg(va) from ( select date as ti, value as va from test_table union all select date as ti, value as va from test1_table ) group by ti マージしたいテーブルを取得するSQL文をいじらずに実行できる方法を探しています。 以上、宜しくお願いします。

  • SQLServerの仕様?バグ?

    以下のデータ、条件でクエリを発行しました。 ■環境 SQLServer2005(データベースはSQLServer2000) ■テーブルA 社員番号 社員名 商品 金額 ---------------------------- 00001 社員A 商品A 100 00002 社員B 商品A 100 00002 社員B 商品B 100 00003 社員C 商品B 100 ■クエリ SELECT COUNT(*) FROM テーブルA WHERE 社員番号 = (1) GROUP BY 社員番号 ここで質問です。 (1)に'0002'と入れたときは「2」と返ってきますが、 (1)に'0004'と入れた場合、結果何も返ってこない(ゼロすら返ってこない)のですが これは仕様なのでしょうか?バグなのでしょうか? そもそもGROUP BYが必要ないということは承知しております。 どなたかお分かりになる方、いらっしゃいますでしょうか。 よろしくお願い致します。

  • GROUP BYを使用したCOUNT

    いつもお世話になっております。 現在下記のようなSQLを発行していまして、 件数を取得したいのですが、取得データの結果が 0件以外の時は良いのですが、0件の時は 「レコードが選択されませんでした」と表示されてしまいます。 何とか0件で表示できないでしょうか? SELECT COUNT(*) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD 苦し紛れに SELECT DECODE(COUNT(*),'',0,COUNT(*)) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD というのもやってみましたが、結果は一緒でした。 どなたかお分かりになる方、回答をお願いします。

  • accessとSQLserverの違い

    こんちは。 DBについて教えて下さい。 社内システムをActiveServerPagesで構築しようと思うのですが、DBについて教えて下さい。 ACCESSについては多少知っているのでACCESSをDBとして構築したいのですが、ちゃんとしたシステムの場合はSQLserverやOracleのほうが良いと言われました。 何がそんなに違うのでしょう?レスポンス? データ件数は20,000件くらいです。

  • group byの並び順を変えるだけで結果が異なる

    Oracleバージョン10 です。 group byの項目の並び順を変えると結果が異なるのですが、何か原因は考えられるでしょうか? 例えば以下のSQL ------------------ SELECT T1.COL1, T1.COL2, T1.COL3, TRUNC(T1.COL4,'MONTH') COLM, SUM(T1.COL5) FROM TABLE1 T1 GROUP BY T1.COL1, T1.COL2, T1.COL3, TRUNC(T1.COL4,'MONTH') MINUS SELECT T1.COL1, T1.COL2, T1.COL3, TRUNC(T1.COL4,'MONTH') COLM, SUM(T1.COL5) FROM TABLE1 T1 GROUP BY TRUNC(T1.COL4,'MONTH'), T1.COL1, T1.COL2, T1.COL3 ------------------ このMINUS結合の結果でデータ(差分)が出力されます。 MINUS結合の前と後で違いがあるのは、GROUP BYの並び順のみです。 TRUNC関数を記載してますが、どうもこのTRUNC関数を除くと、 差分が出力されなくなるようです。 (TRUNCを辞めて、ただのT1.COL4 にした場合) なので、TRUNC関数が何か関係してるかも知れません。 原因が分かりません。オラクルの障害が何かなのかも知れません。 何か原因は考えられるでしょうか?