アクセスのSQL文の検索条件

このQ&Aのポイント
  • アクセスのSQL文の検索条件について教えてください。
  • 以下のデータから0を除外し、部門CDが1のみの人、2のみの人、1と2の両方がある人を抽出したいです。
  • WHERE条件としてどのようなSQL文を使用すれば良いでしょうか?INNER JOINやLEFT JOINを使用する方法も考えましたが、他にも方法があるか教えてください。
回答を見る
  • ベストアンサー

アクセスのSQL文の検索条件

お世話様です。 アクセスのSQL文で検索条件をどのようにすれば良いのか教えて下さい。 下記のデータから0は除外した上で、 部門CD 1のみの人 Bさん 部門CD 2のみの人 Cさん 部門CD 1と2両方ある人 AとEさん を抽出したいです。 社員名 部門CD Aさん  1 Aさん  2 Bさん  0 Bさん  1 Cさん  2 Dさん  0 Eさん  0 Eさん  1 Eさん  2 まず、Where 部門CD <> 0で0を除外しました。 社員名 部門CD Aさん  1 Aさん  2 Bさん  1 Cさん  2 Eさん  1 Eさん  2 INNER JOINやLEFT JOINを使ったり、集計した結果 SELECT 社員名, Sum(部門CD) AS 部門CDから 社員名 部門CD Aさん  3 Bさん  1 Cさん  2 Eさん  3 も考えましたが、他に方法があれば教えて頂けますか。 宜しくお願い致します。

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

  • ベストアンサー
回答No.3

どんな出力結果があなたにとってベストなのかが分からないと・・・。 こんな方法もあるよ・・・という事で。 元テーブルの名前をテーブル1とします。(部門CDは数値型と仮定しています) 部門CDごとに社員名で連番をとります。 SQL文は SELECT [テーブル1].社員名, [テーブル1].部門CD, DCount("*","テーブル1","社員名<='" & [社員名] & "' and 部門CD=" & [部門CD]) AS 連番 FROM テーブル1; これをクエリ1とします。 クロス集計クエリをクエリ1を元に TRANSFORM IIf(IsNull(First([部門CD])),"","◎") AS 式1 SELECT [クエリ1].社員名, Count([クエリ1].連番) AS 兼任部門数 FROM クエリ1 WHERE ((([クエリ1].部門CD)<>0)) GROUP BY [クエリ1].社員名 PIVOT [クエリ1].部門CD;

bobby_jr
質問者

お礼

解説ありがとう御座いました。 上記のクエリをヒントに抽出条件に一致させることが出来ました。

その他の回答 (3)

回答No.4

SELECT DISTINCT "1:1のみの人" AS 区分, 社員名 FROM [テーブル1] WHERE (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=1 AND 社員名=[社員名])>0 AND (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=2 AND 社員名=[社員名])=0 UNION SELECT DISTINCT "2:2のみの人" AS 区分, 社員名 FROM [テーブル1] WHERE (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=1 AND 社員名=[社員名])=0 AND (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=2 AND 社員名=[社員名])>0 UNION SELECT DISTINCT "3:1と2の人" AS 区分, 社員名 FROM [テーブル1] WHERE (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=1 AND 社員名=[社員名])>0 AND (SELECT COUNT(*) FROM [テーブル1] WHERE 部門CD=2 AND 社員名=[社員名])>0; こんな感じです。思い付きで書いたので、もう少し簡略化できるかも知れません。

bobby_jr
質問者

お礼

何度も解説ありがとう御座いました。 クエリが複雑でややこしくなりそうでしたので、今回はこちらのクエリを採用しませんでした。 申し訳御座いません。

回答No.2

Hosoku:抽出する順番は区分で指示できます。

回答No.1

あんまり難しく考えないで・・・。 >部門CD 1のみの人 Bさん >部門CD 2のみの人 Cさん >部門CD 1と2両方ある人 AとEさんを抽出したいです。 それぞれをそのまんまSELECT文にしてUNIONで結合すると・・・。

bobby_jr
質問者

補足

ありがとう御座います。 さらに分からなくなりました。 もう少し詳しく教えて頂けないでしょうか。 よろしくお願いいたします。

関連するQ&A

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • SQL文のエラーについて

    下記のSQL文な実行するとエラーになってしまいます。 数時間考えましたが、上手く行きません。 どなたか教えて頂けないでしょう? 宜しくお願いします。 DB:アクセス97 アクセス2000 SQL実行中に以下のエラーが発生しました。 エラーコード:-3010 [Microsoft][ODBC Microsoft Access Driver] パラメータが少なすぎます。1 を指定してください。 SQLステータス:07001 SELECT mid(U.受払年月日,1,6), U.部門CD, 部門マスタ.部門名, U.商品CD, 商品マスタ.商品名, U.科目CD, 科目マスタ.科目名, U.SUM受払数 FROM (部門マスタ INNER JOIN ((SELECT mid(受払年月日,1,6),部門CD,商品CD,科目CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 BETWEEN '201101' and '201105' GROUP BY mid(受払年月日,1,6),部門CD,商品CD,科目CD) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD) ON 部門マスタ.部門CD = U.部門CD ) INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD ORDER BY U.受払年月日, U.部門CD, U.商品CD, U.科目CD

  • SQL文の書き方について

    SQL初心者です。 教えてください。 A表とB表があります。 A表の伝票Noの列の値とB表の伝票Noの列の値はイコールです。 判定はB表のある別のカラム(sample)と変数Zに格納されている値がイコールという 条件で合致するA表のデータを抽出したいです。 LEFT JOINもしくはINNER JOINなどを使って書けば良いのでしょうか? 例えば SELECT * from A表 INNERJOIN B表 on A表.伝票No = B表.伝票No where B表.sample = 変数Z などと書けば良いのでしょうか?

  • access の UPDATE のSQL文教えてください

    お世話になります。 仕訳抽出 (キー無し)の勘定科目別の金額を勘定科目毎に集計して仕訳集計(キー項目:勘定科目)の金額を更新するSQL文です。 1つ目はOK ですが 2つ目で「構文エラー:演算子がありません」となります。 DoCmd.RunSQL "UPDATE 仕訳集計 set 金額=0 " DoCmd.RunSQL "UPDATE 仕訳集計 " _ & " INNER JOIN 仕訳抽出 ON 仕訳集計.勘定科目 = 仕訳抽出.勘定科目" _ & " SET 仕訳集計.金額 = SUM(仕訳抽出.金額) Group by 仕訳抽出.勘定科目;"

  • SQLについて

    いつもお世話になっております。再度、解決できないSQLの問題が発生してしまいました。 識者の方よろしくお願いします。 環境:Oracle10g ストアドプロシージャ (1)参照テーブル  TEMP1(キー:契約番号、連番),TEMP2(キー:連番、契約種類CD),  タイプマスタ(キー:契約種類CD、タイプCD) (2)追加テーブル対象  契約明細(キー:契約番号,タイプCD) 実施したい事は(2)に保存されていない、(1)のデータを (2)に入れたいです。(1)のTEMP1、TEMP2には追加更新対象のデータが保存されています。 タイプマスタの参照はTEMP2にはタイプCDが存在していない為、 TEMP2.契約種類CDからタイプCDを導出しています。 実現出来ていないことなのですが NOT EXISTSの結果が伴わないので INSERTが正しく出来ずに困っております。 INSERT INTO 契約明細 ( 契約番号 ,タイプCD ) SELECT distinct A.契約番号 ,C.タイプCD FROM TEMP1 A INNER JOIN TEMP2 B ON A.連番 = B.連番 INNER JOIN タイプマスタ C ON B.契約種類CD = C.契約種類CD LEFT JOIN 契約明細 D ON C.タイプCD = D.タイプCD WHERE NOT EXISTS( select 'X' FROM TEMP1 INNER JOIN TEMP2 ON TEMP1.連番 =TEMP2.連番 INNER JOIN タイプマスタ ON タイプマスタ.契約種類CD = TEMP2.契約種類CD AND タイプマスタ.契約種類CD = C.契約種類CD INNER JOIN 契約明細 ON 契約明細.タイプCD = タイプマスタ.タイプCD AND 契約明細.タイプCD = D.タイプCD ) ; よろしくお願いいたします。

  • SQLについて

    以下のSQLを実行すると。 SQL実行中に以下のエラーが発生しました。 エラーコード:907 [Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。 というエラーが表示されます。 どこがおかしいでしょうか? SELECT Q1.Pコード, Q1.Qコード, T1.E名称 A名称, T2.E名称 B名称, T3.E名称 C名称, T4.E名称 D名称, FROM ( ( ( ( SELECT Pコード, Qコード, Aコード, Bコード, Cコード, Dコード, FROM 報告書 WHERE Pコード = '0001' AND Qコード = '0001' AND ) Q1 INNER JOIN Eマスタ T1 ON Q1.Aコード = T1.Eコード ) INNER JOIN Eマスタ T2 ON Q1.Bコード = T2.Eコード ) INNER JOIN Eマスタ T3 ON Q1.Cコード = T3.Eコード ) INNER JOIN Eマスタ T4 ON Q1.Dコード = T4.Eコード ORDER BY Pコード, Qコード;

  • SQLの書き方について

    下記のSQL文に科目マスタから科目名を取得する文を追加したいと考えてます。 色々と考えてみたのですが、私のスキルでは上手く行かなくて困っています。 どなたか教えて頂けないでしょう? 宜しくお願いします。 DB:アクセス97・アクセス2000 科目マスタ 科目CD  科目名 SELECT U.商品CD, 商品マスタ.商品名, U.[部署CD], 部署マスタ.部署名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,受払数) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.[部署CD], U.受払年月日, U.[SUM受払数] 科目名を取得する文を追加後のSQL文 SELECT U.商品CD, 商品マスタ.商品名, U.部署CD, 部署マスタ.部署名, U.科目CD, 科目マスタ.科目名, U.SUM受払数 FROM 部署マスタ INNER JOIN ((SELECT 商品CD,受払年月日,部署CD,科目CD,SUM(受払数) as SUM受払数 FROM 受払TBL WHERE 受払年月日 = '20110510' GROUP BY 商品CD,部署CD,受払年月日,科目CD,受払数 ) AS U INNER JOIN 商品マスタ ON U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD ) ON 部署マスタ.部署CD = U.部署CD ORDER BY U.商品CD, U.部署CD, U.受払年月日, U.科目CD, U.SUM受払数 上記のSQLを実行するとエラーになります。 SQL実行中に以下のエラーが発生しました。 エラーコード:-3100 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'U.商品CD = 商品マスタ.商品CD INNER JOIN 科目マスタ ON U.科目CD = 科目マスタ.科目CD' の 構文エラー : 演算子がありません。 SQLステータス:37000 宜しくお願いします。

  • SQL文 合計値を出力する

    ID  項目CD  評価結果 ------------------------- A   1-1-1   ○ A   1-1-1   ○ B   1-1-1   × C   1-1-1   ○ A   1-2-1   ○ A   1-2-1   ○  B   1-2-1   ○ C   1-2-1   〇 上記のテーブルがあります 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです 理想SELECT結果 ID  合計  -------------- A   2   (1-1-1で○が2つあるが、1つとして計算) B   1    C   2     SELECT ID,SUM(評価結果) FROM TABLE GROUP BY ID でIDと合計までは出せました 現在のSELECT結果 ID  合計  -------------- A   4   (すべての○の合計を出力) B   1    C   2   項目CDが同じ場合"○"を1つとして集計するにはどうすればいいのでしょか?

  • 集計表の外部結合

    SQL文について勉強中ですが、集計のやり方が分からないためお教えください。 SQL SERVER2008r2 Management StudioでSQLを書いてます。 ◎TM部門(店舗マスタ) 店舗CD 店舗名 ◎TM店舗部門(店舗部門マスタ) 店舗部門CD 店舗部門名 ◎TT売上伝票(売上伝票) 伝票番号 行 店舗CD 店舗部門CD 売上日 売上時間 商品CD 商品名 数量 税抜単価 税込単価 税抜金額 税込金額 消費税 伝票合計 上記テーブルがあり、日付を限定して集計したいのですが、うまくSQLが書けません。 【希望結果例】 集計期間:2014/04/20 ~ 2014/05/20 日付      | 店舗名 |店舗部門名  |  日別合計 2014/05/21 | 店舗A  | 店舗部門A   | sum(伝票合計) 2014/05/21 | 店舗A  | 店舗部門B   | sum(伝票合計) 2014/05/21 | 店舗A  | 店舗部門C   | sum(伝票合計) 2014/05/21 | 店舗B  | 店舗部門D   | sum(伝票合計) 2014/05/21 | 店舗B  | 店舗部門E   | sum(伝票合計) 2014/05/21 | 店舗B  | 店舗部門F   | sum(伝票合計)                    ~ SELECT 伝票日付, 店舗CD, 店舗部門CD, SUM(伝票合計) AS 日別合計 FROM TT売上伝票 GROUP BY 伝票日付,店舗CD,店舗部門CD HAVING 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) ORDER BY 伝票日付,店舗CD,店舗部門CD 上記の結果 日付      | 店舗CD   |店舗部門CD   |  日別合計 2014/05/21 | 店舗A    | 店舗部門A   | sum(伝票合計) 2014/05/21 | 店舗A    | 店舗部門B   | sum(伝票合計) 2014/05/21 | 店舗A    | 店舗部門C   | sum(伝票合計) 2014/05/21 | 店舗B    | 店舗部門D   | sum(伝票合計) 2014/05/21 | 店舗B    | 店舗部門E   | sum(伝票合計) 2014/05/21 | 店舗B    | 店舗部門F   | sum(伝票合計) 集計は全く問題ないのですが、ここからリレーションし、店舗名、店舗部門名を表示したいのですが、書き方が分かりません。 無知ながら、下記方法を試しました結果 SELECT TT売上伝票.店舗CD, TM店舗.店舗名, TT売上伝票.店舗部門CD, TM店舗部門.店舗部門名 FROM TT売上伝票 JOIN TM店舗 ON TM店舗.店舗CD=TT売上伝票.店舗CD JOIN TM店舗部門 ON TM店舗部門.店舗部門CD=TT売上伝票.店舗部門CD UNION ALL SELECT 伝票日付, 店舗CD, 店舗部門CD, SUM(伝票合計) AS 日別合計 FROM TT売上伝票 GROUP BY 伝票日付,店舗CD,店舗部門CD HAVING 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4) ORDER BY 伝票日付,店舗CD,店舗部門CD エラーメッセージ ステートメントが UNION、INTERSECT、EXCEPT のいずれかの演算子を含んでいるときは、選択リスト内に ORDER BY 項目が必要です。 無知ながら、UNION演算子でやる方法と、サブクリエを使う方法があるのではと思いますが、出来れば利点と欠点を含めてお教え頂けたら幸いです。

  • Accessの表結合SQL

    AccessのSQLで外部結合を複数使うと SQLがエラーになります。 クエリで確認してエラーにならない様につくってみましたが、意図する事をやろうとするとエラーになります。 どこが悪いか教えていただけませんか?おそらくSQLサーバーでは余裕で通るSQLだと思うのですが。。。 SQL = SELECT * FROM T1 LEFT JOIN T2 ON T1.A = T2.A LEFT JOIN T3 ON T1.B = T3.B LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' やりたいのはT1を基準にT2,T3,T4からデータを引っ張ってきたい。その条件としてT4から引っ張ってくるのは T4.DがiNumである事、基準となるT1のT1.EがiNumである事です。 Accessでは"AND T4.D = iNum"がだめで、 WHERE区に書くと外部結合にもかかわらずT4.D = iNumのデータしか抽出されなくなる。(T1.C = T4.CのデータがT4.D = iNumでなくてもT1のデータが抽出されなくてはならない。) さらに SQL = SELECT * FROM ((T1 LEFT JOIN T2 ON T1.A = T2.A) LEFT JOIN T3 ON T1.B = T3.B) LEFT JOIN T4 ON T1.C = T4.C AND T4.D = iNum WHERE T1.E = 'iNum' こんな括弧が必要になってくる。 これだとT1とT2を外部結合した結果をT3と外部結合して さらにその結果をT4と外部結合しているという意味あいになってしまって、意図が違うのですが。。 結果は同じなのでAccessに譲ってやってもいいのですが 前者はT1で抽出されなければならないデータが抽出されないので困ります。 よろしくお願いいたします。