• 締切済み

汎用性があるSQL式を教えて欲しいです

piroin654の回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

質問の「汎用性があるSQL式」というのは、質問の例では、 「△」がついているのはりんごだけですが、これがたとえば、 フラグ ナンバー    名前  カテゴリ      日付 △     1      大根   野菜     2019/10/01 △     2      りんご  果物     2014/10/02       3      りんご  果物       4      牛肉   肉類     2019/10/03       5      大根   野菜       6      みかん  果物     2019/10/09 のようにデータを追加した場合にユニオンを使うと「△」がついた 数だけユニオン式を追加していかなくてはならないのでこれを避けたい ということだと解釈して、テーブルの名前を「テーブル1」とすれば、 SELECT Temp1.フラグ, Temp1.ナンバー, Temp1.名前, Temp1.カテゴリ, IIf(Temp1.カテゴリ = (SELECT Temp3.カテゴリ FROM テーブル1 As Temp3 WHERE Temp3.フラグ = ('△') and Temp1.カテゴリ=Temp3.カテゴリ AND Temp1.名前=Temp3.名前 AND IsNull(Temp1.日付)), (SELECT Temp2.日付 FROM テーブル1 As Temp2 WHERE Temp2.フラグ = '△' AND Temp1.カテゴリ=Temp2.カテゴリ AND Temp1.名前=Temp2.名前),Temp1.日付) AS 日付 FROM テーブル1 AS Temp1 WHERE (Temp1.フラグ) Is Null; という選択クエリで対応できます。この選択クエリはIIf関数と二つの サブクエリを内蔵しています。少々複雑ですが一応質問の意図と 見える範囲での条件で設定しています。 この場合クエリの結果は、 フラグ ナンバー    名前  カテゴリ      日付       3      りんご  果物     2014/10/02             4      牛肉   肉類     2019/10/03       5      大根   野菜     2019/10/01          6      みかん  果物     2019/10/09 のようになります。 ただし、 フラグ ナンバー    名前  カテゴリ      日付 △     1      大根   野菜     2019/10/01 △     2      りんご  果物     2014/10/02       3      りんご  果物       4      牛肉   肉類     2019/10/03       5      大根   野菜       6      みかん  果物     2019/10/09       7      りんご  果物 のようにナンバー7のりんごがある場合は、 フラグ ナンバー    名前  カテゴリ      日付       3      りんご  果物     2014/10/02             4      牛肉   肉類     2019/10/03       5      大根   野菜     2019/10/01          6      みかん  果物     2019/10/09       7      りんご  果物     2014/10/02 のようにナンバー7のりんごの日付がナンバー2のりんごの日付が表示されますが、 フラグ ナンバー    名前  カテゴリ      日付 △     1      大根   野菜     2019/10/01 △     2      りんご  果物     2014/10/02       3      りんご  果物       4      牛肉   肉類     2019/10/03       5      大根   野菜       6      みかん  果物     2019/10/09 △     7      りんご  果物     2019/10/10       8      りんご  果物 のようにナンバー7のりんごに日付があり、フラグが「△」で、 ナンバー8にりんごがあり日付が無い場合、上記のクエリを実行すると フラグ ナンバー    名前  カテゴリ      日付       3      りんご  果物     2014/10/02       4      牛肉   肉類     2019/10/03       5      大根   野菜     2019/10/01       6      みかん  果物     2019/10/09       7      りんご  果物     2019/10/10       8      りんご  果物     2014/10/02 最低でも上記のようになればいいのですが、残念ながらこの場合は エラーがでます。というのもサブクエリではレコードを一つしか 抽出できない決まりがあるからです。もしナンバー7にフラグ「△」 がなければ、上記の結果がでますが、ただし、この場合はナンバー7の 日付はどのりんごのデータに挿入するのか明らかになっていないし、 質問のデータの編集の意図がこれ以上に明らかでないので、このように りんごのデータが重複してフラグに「△」がついているものとついて いないものの組み合わせがないものとすれば上記のクエリで質問の 「汎用性のあるSQL式」の回答とします。 もし、データの編集に条件が加わるならば可能であれば回答します。 わからないところがあれば補足してください。

関連するQ&A

  • SQLの質問

    ※前質問は間違いました為、再度、質問させて頂きました。 以下のようにテーブルにレコードが登録されていたとします。 顧客テーブル(customer) 客No. 名前 1 鈴木 2 佐藤 3 高橋 4 田村 5 長谷川 登録テーブル(reserve) 客No. 日付 フラグ 1  2007-05-05   1 1  2007-05-06   2 2  2007-06-05   1 3  2007-05-30   1 5  2007-05-25   2 このとき、以下のような結果を表示させたいのですが どのようなクエリを作成すればよろしいのでしょうか。 客No. フラグが1であったレコード数 1   1 2   1 3   1 4   NULL 5   0 ※客No4は登録テーブルに存在しなかった為 NULLと表示させたいです。 何卒宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • SQLの条件検索について

    下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。

  • SQLでグループ化して降順表示がうまくいきません

    個人的にMysql、php環境でサイトを作っております。 そこで、素人質問で申し訳ありませんが、SQLでお伺いしたい点があります。 例えば下のようなテーブルがあります。 ▽果物テーブル 果物ID | 果物名 | 売れた日付 1 | リンゴ | 2008/11/1 2 | みかん | 2008/11/2 3 | みかん | 2008/11/3 4 | リンゴ | 2008/11/4 これを、 『最近売れた』果物順に、『グループ化』して並べ替えたいと思い、 下記のようなsqlを組みました。 $sql = "SELECT 果物名, FROM 果物テーブル GROUP BY 果物名 ORDER BY 売れた日付 DESC"; 意図としてはリンゴ、みかんの順に並べ替えたいのですが、 みかん、リンゴの順に表示されてしまいます。 想像では、グループ化したとき、古い日付の方が残ってしまい、 | リンゴ | 2008/11/1 | みかん | 2008/11/2 この部分を対象にして日付を降順にしてしまうからだと思うのですが、 これをうまく解決する方法が分かりません。 MSアクセスなどですと先に二重にクエリをかけるなどすることで 「先に降順で並べ替えたクエリを出し、その後グループ化させる」 など処理が簡単なのですが、phpではどうするのかいまひとつ分からず・・・ 申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • Excelでこのような集計はどうしたらいいですか?困ってます!

    こんにちは。 以下のような集計を行いたいのですが、どうすればよいかわかりません。教えてください!! Sheet(1) A列、B列、C列 カテゴリ、数、品名 =================== 野菜、1、大根 野菜、2、ねぎ 果物、2、いちご 肉、3、牛肉 果物、1、りんご 肉、2、豚肉 ・ ・ ・ Sheet(2) A列、B列、 カテゴリ、金額 =================== 野菜、300 果物、300 肉、500 ・ ・ ・ 各品物は、100円均一とし、Sheet2でカテゴリ毎に必要な金額を求めます。Sheet1は、およそ1000行ほどあるので、一括で数式で求めたいのですが、どのような関数を使えばよいのかわかりません。 お願いします!

  • カテゴリと個別商品の集計SQLについて

    カテゴリと個別商品の集計SQLについて質問です。 postgresのバージョンは9.0です。 次のテーブルより ------------------------------------------ id  カテゴリ  商品名    日付       値 ------------------------------------------ 1  野菜    ホウレン草  2010-01-01  100 2  野菜    ホウレン草  2010-01-02  100 3  野菜    ホウレン草  2010-02-02  100 4  野菜    キャベツ    2010-01-02  200 5  肉      牛肉      2010-01-01  500 6  肉      牛肉      2010-01-02  500 -------------------------------------------- 下の結果を得るSQLを考えています。 月毎の値の集計 カテゴリ  商品名     1月  2月    合計   カテゴリ合計  カテゴリ合計と合計との差 ----------------------------------------------------------------------------- 野菜    ホウレン草   200  100    300    500        200 野菜    キャベツ     200    0    200    500        300 肉      牛肉      1000   0    1000   1000         0 ----------------------------------------------------------------------------- ここでカテゴリの合計とは 上の場合、 ホウレン草(300)+キャベツ(200)=カテゴリ野菜(500)、です。 クロス集計とサブクエリを使えば出来そうなのですが、カテゴリ合計を出す部分の SQLが思いつきません、よろしくお願い致します。

  • チェックボックスの値に応じてPHP内でSQLを発行する方法

    HTML検索フォームにチェックボックスを複数設け、チェックが入ったら チェックされているもの同士をORで結んだものを、他の検索キーとANDで結ぶ SQL文を発行したいのですが。 これを効率的に行う方法を、以前に本掲示板でご教示いただきました。 <input type="checkbox" name="food[]" value="1">果物 <input type="checkbox" name="food[]" value="2">野菜 <input type="checkbox" name="food[]" value="3">肉類 if(is_array($_POST['food'])) { $sql .= " AND ("; $i=0; # 「or」 をつけるフラグ foreach($_POST['food'] AS $food_code) { if ($i) { $sql .= " OR "; } $sql .= "MYTABLE.MYFOOD = '$food_code'"; $i++; } $sql .=")"; } これを応用し、MySQLのMYTABLE.MYFOODに次のようなレコードが登録されているとして、 果物―みかん 野菜〔にんじん〕 野菜(キャベツ) 肉類【豚バラ】 果物~りんご  : これら先頭2文字を切り出して(あるいは「LIKE '肉類%'」のように、~で始まる、 でもいいです)真偽を評価したいです。 その際、果物と肉類にチェックが入ったと仮定して AND (SUBSTRING(MYTABLE.MYFOOD,1,4) = '果物' OR SUBSTRING(MYTABLE.MYFOOD,1,4) = '肉類') としてみたら、合致するものだけをうまく抽出できたのですが、 このようなロジックを冒頭のPHPコードに組み込むにはどう書いたらいいでしょうか? なお、果物5種類、野菜3種類、肉類7種類と、いずれも有限ですので、 SQL文をベタ書きすることは十分可能だと思っています。

    • ベストアンサー
    • PHP
  • エクセル グループごとの検索について

    グループごとを検索し、その情報を縦列に表示したいのですが、悩んでおります。 横に表示するのは、以下の関数を使って出来たのですが、 =IF(ISNA(MATCH(COLUMN(A4)&$A4,sheet1!$E$2:$E$700,0)) これだと使い勝手が悪く、困っております。 例えば (sheet1)の情報を、 品種    品名   金額  産地    果物    りんご1 200 津軽 果物1 果物    りんご2 250 むつ 果物2 果物    みかん  300    果物3 果物    ぶどう  400    果物4 ーーーーーーーーーーーーーーーーーーーーーーーー 海外果物  パパイヤ 300    海外果物1 海外果物  アドカボ 100    海外果物2 海外果物  バナナ  130    海外果物3 ーーーーーーーーーーーーーーーーーーーーーーーー 野菜    なす   100    野菜1 野菜    にんじん 200    野菜2 野菜    きゃべつ 300    野菜3 野菜    大根   150 練馬 野菜4 野菜    大根2  180 京都 野菜5 (sheet2)において [A]又は[B]のある位置のセルに、品種(この場合、野菜)を打ち込むと、    [ A ] [ B ]なす   100        にんじん 200        きゃべつ 300        大根   150 練馬     大根2  180 京都   このように、品名と値段、産地が縦に並んで欲しいのです。 どうぞお知恵を貸して下さいませ。 宜しくお願いします。

  • <li>内の<ul>を横に表示する方法

    <li>内の<ul>を横に表示する方法がわからずに困っています。 例えば <ul> <li>野菜 <ul> <li>大根 <li>にんじん </ul> </li> <li>果物 <ul> <li>りんご <li>バナナ </ul> </li> </ul> これを以下のように表示させたいのです。 ・野菜   ・大根        ・にんじん ・くだもの ・りんご        ・ばなな この場合、CSSはどのように記載すればいいのでしょうか。 ご存知の方、ご教授頂けると幸いです。

    • ベストアンサー
    • HTML
  • Excelでの全通りの組み合わせ出力方法2

    こんにちは。 http://okwave.jp/qa/q4122783.html にあった質問より、もう少し複雑な組み合わせを出力したいと思っています。 例えば 【肉類】として 牛肉 豚肉 鶏肉 魚肉  の中から2つ選び 【根菜】として 大根 にんじん たまねぎ サツマイモ の中から2つ選び 【葉野菜】として キャベツ 白菜 キャベツ レタス ほうれん草 の中から2つ選ぶ、 といった場合の全ての組み合わせを 【肉類】【根菜】【葉野菜】の列、または 【肉類1】【肉類2】【根菜1】【根菜2】【葉野菜1】【葉野菜2】の列に出力する事は出来るものでしょうか? 組み合わせ例としては、 牛肉、魚肉、大根、たまねぎ、レタス、ほうれん草 のような感じです。 実際に使用したい選択肢の総数が100個ほどあり、手入力には多すぎるので なんとかExcelで出来たらと思ってるのですが……。  ご存知の方がいらっしゃいましたらご教授下さい!

  • 複数キーが存在する場合のIN演算子

    閲覧ありがとうございます。 「IN演算子、複合キー」 等で検索を行いましたが、知りたい情報を見つけ切れなかったので投稿させていただきました。 SQLserver2005でのWhere句の書き方について悩んでます。 以下のテーブルからのデータを取得する方法、ご解答いただければ幸甚です。 食べ物テーブル 名前|品種|ID|ジャンル| ------------------------ りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種1|003|野菜| ごぼう|品種2|004|野菜| IDはユニークとなっていて、 主キーは「名前」と「品種」で複合キーになっているとします。 クエリで、特定の1行を複数同時に取得したいと考えてます。 ◆IDを条件とする場合 IN演算子を使う  where IN('001','002','004') と指定 期待値: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| 検索結果: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| ◆「名前」「品種」を指定する場合 IN演算子を使う  where IN('りんご',ごぼう) and IN('品種1','品種2') 期待値: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| 検索結果: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種1|003|野菜| ごぼう|品種2|004|野菜| 当然といえば当然なのですが、 期待値の通りに取得するには以下のように記述するしかないのでしょうか。 Where (名前 = 'りんご' and 品種 = '品種1') or (名前 = 'りんご' and 品種 = '品種2') or (名前 = 'ごぼう' and 品種 = '品種2') . . . . 取得したい行が増えれば増えるほど 記述が億劫になってきました。。。 ほかにいいクエリの記述方法があれば教えてください。 Oracleであれば、良い具合に 複合キーの同時指定をできると聞いたのですが、SQLserverには存在しないのでしょうか? よろしくお願い致します。