ray88’s diary

お仕事で困ったとき用の自分用の覚書

2023-08-01から1ヶ月間の記事一覧

SQL指南書 HAVING句① データの歯抜けを探す

SQL 指南書集 目次 - ray88’s diary ■HAVING句のポイント ・SQLは複数行をまとめて集合として扱う。つまりテーブル全体は一つの集合とみなすことができる ・HAVING句はGROUP BY句がなくても使用できる ・GROUP BY句が存在しない場合はテーブル全体が1行に集…

SQL 片方のテーブルにしか存在しないデータの抽出と結合

■自己結合を利用した片方のテーブルにしか存在しないデータの抽出 【例題】 以下のカラムを持つテーブルがあります。 グループID、グループ名、メンバ数、ユーザID、ユーザ名 1つのテーブルから以下2つのレコードをそれぞれ抽出して比較し、縦に結合したい…

SQL指南書 比較述語とNULL⑥ 集約関数とNULL

SQL 指南書集 目次 - ray88’s diary ■入力が空テーブルの場合、極値関数と同様に COUNT関数以外の集約関数(AVG, SUM 等)もNULLを返す 【例題】 東京在住の生徒の平均年齢より若いAクラスの生徒を選択する --東京在住の生徒の平均年齢より若いAクラスの生徒…

SQL指南書 比較述語とNULL⑤ 限定述語と極値関数は同値ではない

SQL 指南書集 目次 - ray88’s diary 【例題】 前回ALL述語で記述した以下の例題を 極値関数で書き直すと次のようになる(ALL関数では元データにNULL値を含む場合正しく出力されない) --Bクラスの東京在住の最も若い生徒より若いAクラスの生徒を選択する SEL…

SQL指南書 比較述語とNULL④ 限定述語とNULL(ALLとANY)

■限定述語 SQLには ALL と ANY の2つの限定述語がある。 ANY は IN と同値のため、あまり使用されない ■ALL ALLは比較述語と併用し「~全てと等しい」や「~全てよりもおおきい」という意味を表す【具体例】 以下のテーブルよりNULLを排除したケースで「Bク…

SQL指南書 比較述語とNULL③ NOT IN と NOT EXISTS は同値ではない

SQL 指南書集 目次 - ray88’s diary ■NOT IN を NOT EXISTS で書き換える場合の注意 パフォーマンスチューニングにおいてINをEXISTSで書き換えることはよく行われる。 これは問題のない同値変換だが、問題はNOT INをNOT EXISTSで書き換える場合、 必ずしも結…

SQL指南書 比較述語とNULL② CASE式とNULL

SQL 指南書集 目次 - ray88’s diary ■CASE式で間違えがちなSQL文の例 以下のSQLが絶対に「×」を返さない理由 ・「WHEN NULL THEN」は「WHEN col_1 = NULL」の省略系である。 ・よって、NULL判定の結果は常にunknown となる ・WHEN句と同様にCASE式の評価方法…

SQL指南書 比較述語とNULL① 非中律が成立しない

■排中律(excluded middle) とは 「命題とその否定を「または」でつなげて作成される命題は全て真である」 という命題を2値倫理で排中律と呼ぶ 【排中律の具体例】 ジョンは20歳か、(または)20歳でないかどちらかである ■SQLでは排中律は成立しない …

SQL指南書 3値倫理 ② unknown

SQL指南書 3値倫理とNULLの扱い - ray88’s diary 【前提条件】 真理値のunknownとNULLの一種であるUNKNOWN(未知)は異なるものである。 全社は真理値のれっきとした値だが、後者は値でも変数でもない ※以降の記述について、前者を小文字でunkonown 後者を…

SQL指南書 3値倫理① NULLの扱い

SQL 指南書集 目次 - ray88’s diary ■3値倫理とは 普通の言語の真理値型がtrue,falseという2つの値を持つのに対し、SQLはそれに加えてunknownという第3の値を持つ■SQLで3値倫理が採用されている理由→NULLがあるから■NULLは2種類に分けて考えられる ①未…

SQL 累計を求める

SQL 目次 - ray88’s diary ■部署A,部署B,部署C ごとに累計売上を抽出する 【方法1】 このSQLでは、SUM(amount) OVER (PARTITION BY section ORDER BY year, month)の部分で、セクションごとに年と月で並び替えた上でamountの累積和を計算しています。PARTIT…

SQL 列持ち→行持ちへの変換(UNION ALL)

SQL 目次 - ray88’s diary SQL 指南書集 目次 - ray88’s diary 外部結合で行列変換② (列→行):繰り返し項目を1列にまとめる UNION ALL - ray88’s diary ■方法1:UNION ALLで列持ちのデータを行持ちに変換する 【事例】 部署A、部署B、部署Cの月々の売り…

SQL指南書 ランキング(自己非等値結合)

SQL 指南書集 目次 - ray88’s diary ■以下は要件に応じて様々な順位付け方式にカスタマイズすることが可能な柔軟なSQL /* ランキング 1 位から始まる。同順位が続いた後は不連続(p.37) */ SELECT P1.name, P1.price, (SELECT COUNT(P2.price) FROM Products …

SQL サブクエリの再利用(WITH句)

SQL 目次 - ray88’s diary ■WITH句 WITH句を使用したSQL構文は、一般的に「Common Table Expressions(CTE)」と呼ばれます。 CTEは、SQLのクエリ内で一時的な結果セットを生成し、その結果セットを基にさらにクエリを 行うための非常に強力なツールです。 …

ExcelVBA Excel→UTF8(BOMなし)へ変換

ExcelVBA 目次 - ray88’s diary 【BOMなし・改行コードはUnix(LF)】 Sub ConvertExcelToUTF8CSVWithoutBOM_LF(filePath As String) Dim wb As Workbook Dim ws As Worksheet Dim rng As Range Dim cell As Range Dim r As Long, c As Long Dim csvContent …

PostgreSQL CSVインポート手順とエラーの対処方法(pgAdmin4)

①Excelを名前を付けて保存→UTF8形式で保存②pgadmin4で対象のテーブルを右クリック→インポート③インポート設定画面でファイル形式やエンコード形式、ヘッダの設定をする④OKボタンでインポート■CSVインポートエラーとなったばあい・CSVの置き場所がPostgr…

SQL ランキングを出す (RANK,OVER,PARTITION BY,DENSE_RANK)

SQL 目次 - ray88’s diary 【RANK関数】 RANK()関数は、指定した順序でデータをランク付けするための関数。 たとえば、売上の高い順に商品をランク付けしたい場合、RANK()関数を使用します。 【RANK関数のOVER句の役割】 ランキングの対象となるデータの範囲…

SQL指南書 部分的に不一致なキーの検索(自己結合)

SQL 指南書集 目次 - ray88’s diary ■事例1 【テーブル説明】 ・同じ家族の人間は家族IDが一致する ・基本的に同じ家族は同じ住所に住んでいるものとする ・ホームズとワトソンのように家族ではないが同居のカップルもいる 【お題】 前田夫妻のように同じ家…

SQL指南書 重複業の削除(自己結合)

SQL 指南書集 目次 - ray88’s diary 【お題】 以下のテーブルより重複行を削除する 【下準備】 --下準備:テーブルにシリアルナンバーの列を追加する ALTER TABLE Products2 ADD COLUMN id SERIAL PRIMARY KEY; 【重複行削除のSQL①】 各重複グループから…

SQL指南書 重複順列・順列・組み合わせ(自己結合)

SQL 指南書集 目次 - ray88’s diary ■以下のテーブルよりそれぞれ重複順列・順列・組み合わせを作成する 【重複順列を作成】 重複順列 - 数学ノート /* 重複順列を得るSQL(p.29) */ SELECT P1.name AS name_1 ,P2.name AS name_2 FROM products P1,products …

SQL指南書 ソート用の列を作成する(ORDER BY句にCASE式を使用)

SQL 指南書集 目次 - ray88’s diary 【お題】 以下の表を並べ替えする。key「B→A→D→C」の順番に並べ替える 【回答】 /* 演習問題3:ORDER BY でソート列を作る(p.288) */ SELECT * FROM Greatests ORDER BY CASE key WHEN 'B' THEN 1 WHEN 'A' THEN 2 WHEN …

SQL指南書 行持ちから列持ちへの水平展開

SQL 指南書集 目次 - ray88’s diary SQL指南書 行持ちから列持ちへの水平展開 - ray88’s diary■以下のテーブルを行持ちから列持ちへ水平展開する 以下のように表頭に合計や再掲の列を持つクロス表を作る。 ※「全国」は東京等も含めたテーブルに存在するデー…

SQL指南書 複数列の最大値を求める

SQL 指南書集 目次 - ray88’s diary SQL 列持ち→行持ちへの変換(UNION ALL) - ray88’s diary■SQLでは複数行の中から最大値、最小値を求めることは容易だが、 複数列の中から最大値・最小値を選ぶにはどのようにしたらよいか?【お題】 以下のテーブルのx…

SQL指南書 CASE式の中で集約関数を使う(CASE文応用)

SQL 指南書集 目次 - ray88’s diary ■学生の所属クラブ一覧表。(テーブル名:StudentClub) ・複数クラブに所属している場合はメインに活動しているクラブに「Y」のフラグが立っている ・以下の条件でクエリを発行する 1.1つだけのクラブに所属している…

SQL指南書 テーブル同士のマッチング(CASE文の応用)

SQL 指南書集 目次 - ray88’s diary ■ポイント ・DECODE式と比較するとCASE式は式を評価できることが利点 ・CASE式の中でBETWEEN,LIKE,といった便利な述語群が使用可能 ・特にINとEXISTSはサブクエリを引数に取れる為、強力な表現力を持つ ・集約を行わない…

SQL指南書 条件を分岐させたUPDATE(CASE文応用)②

SQL 指南書集 目次 - ray88’s diary 【事例2】 主キーの入れ替え a→b b→a 【素人の作業例】 --STEP1: aを作業用の値「f」へ退避 UPDATE SomeTable SET p_key = 'f' WHERE p_key = 'a'; --STEP2: b → a へ UPDATE someTable SET p_key = 'a' WHERE p_key…

SQL指南書 条件を分岐させたUPDATE(CASE文応用)

SQL 指南書集 目次 - ray88’s diary■数値型の列に対し、現在の値を判定対象として別の値へ変えたいというケース 【事例】 以下の条件でテーブルに更新をかける 1.現在の給料が30万円以上の社員は10%減給とする 2.現在の給料が25万円以上28万円以下の社…

SQL指南書 CHECK制約で複数の列の条件関係を定義する(CASE文応用)

SQL 指南書集 目次 - ray88’s diary ■Check制約の条件式にCASE文を使用する 【事例】 女性社員の給料は20万円以下という給与体系をもつ会社の人事テーブルの制約 ※「--error」のコメント文のところでエラーとなる。(女性社員の給料が20万円以上で制約違…

PostgreSQL 複数行まとめてコメントアウトする方法

PostgreSQL 目次 pgadmin コメントアウトを一括で実行する | mebee

SQL_指南書 異なる条件の集計を1つのSQLで行う(CASE式の応用)

SQL 指南書集 目次 - ray88’s diary 【事例】県別の人口を保持するテーブルに性別を付け加えたテーブルから 男女別・県別の人数の合計を求める 【サンプルコード1】 以下は素人が書いた場合のSQL。2回に分けて男性の人口・女性の人口を抽出し、 そのあとに…