自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

  • 【SQL】GROUP BY, HAVING, COUNTの3つでグループ化して集計、条件で絞り込みカウントする

    GROUP BY + HAVING + COUNT よくある手法の一つに、 売上データから営業担当者ごとに売上件数を集計し、売上件数が2件以上の人だけ表示したい。 というものがある。 id salesperson region amount 1 Alice East 100 2 Bob West 200 3 Alice East 150 4 Bob West 250 5 Carol East 300 データがこの場合、SQLで表現すると、 SELECT salesperson, COUNT(*) AS num_sales FROM sales GROUP BY salesperson HAVING COUNT(*) >= 2; 結果はこうなる。 salesperson num_sales Alice 2 Bob 2 GROUP BY カラムが同じ値ごとに集計 GROUP BY はカラムを指定し、同じ値ごとに集計をすることができる。 今回は salesperson を指定することで、同じ営業 ...
  • 【SQL】Oracleデータベースのファンクション(関数)の一覧

    NVL(A,B) AがNULLならBを返す 以下は、bonus カラムの値がNULLの場合、そのまま表示させず、0を返すようにしている。 SELECT NVL(bonus, 0) AS bonus_value FROM employees; 文字列を返すこともできる。ただし元のカラムの値と同じデータ型に限る。 SELECT NVL(middle_name, '(なし)') AS middle FROM users; つまり以下はエラー(暗黙的に型変換される可能性もあるが、エラーになることがあるため、推奨されない) SELECT NVL(bonus, '賞与なし') AS bonus_value FROM employees; この場合、型変換を明示的に指定して変換をするとよいだ ...
  • OracleDBのSQLまとめ

    dockerにインストールしたOracle−XEを使用している。 UbuntuのDockerでOracle DB SQL Silverの試験勉強の環境を整える HR スキーマを搭載した。 雇用日時をもとに絞り込みをする 【非推奨】文字列を与えると、暗黙的にDATE型に変換する 例えば、2015年1月1日以降に雇用した従業員を出力するには、 SELECT * FROM employees WHERE hire_date >= '2015-01-01' ; そして、新人を上に表示させるため、降順に並び替える。 SELECT * FROM employees WHERE hire_date >= '2015-01-01' ...
  • UbuntuのDockerでOracle DB SQL Silverの試験勉強の環境を整える

    至急、Oracle DB SQL Silverの試験を受ける必要が出てきた。 そこで、すでにあるUbuntuのdockerで、OracleDBの環境を整えていく。 前提 dockerのバージョンは以下の通り、 Docker version 26.1.3, build 26.1.3-0ubuntu1~22.04.1 Oracle公式が提供しているdockerのイメージは下記。 https://hub.docker.com/r/gvenzl/oracle-xe Oracle社のエンジニア、G. Venzl 氏から提供されている。 dockerのイメージをPullする 現時点での最新版は、21.3.0 なので、以下の ...
  • 【データベース】基本的なSQL文の一覧【SELECT, INSERT INTO, DELETE, UPDATE, UNION, JOIN】

    【導入】dockerでDatabaseを用意する。 Oracle DBを用意する UbuntuのDockerでOracle DB SQL Silverの試験勉強の環境を整える ただし、この記事ではPostgreSQLでの使用を想定しているため、SQLが若干違う点に注意。 テーブルをつくるCREATE TABLE文 CREATE TABLE テーブル名 ( カラム名1 データ型 [制約], カラム名2 データ型 [制約], ... ); この書き方に倣って、 CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT ...
  • SQliteはマルチスレッド・マルチプロセスに対応していない

    SQliteはマルチスレッド・マルチプロセスに対応していない。 同時に大量のクエリをさばくことはできない。 実際にやってみる djangoで実際にやってみる。ベースは、40分django from django.shortcuts import render,redirect from django.views import View from .models import Topic from .forms import TopicForm import threading def writing(data): form = TopicForm(data) if form.is_valid(): form.save() class IndexView(View): def get(self, request, *args, **kwargs): print(Topic.objects.all().count()) context = {} context["topics"] = Topic.objects.all() return render(request,"bbs/index.html",context) def post(self, request, *args, **kwargs): threads = [] copied = request.POST.copy() for i in range(1000): thread = threading.Thread(target=writing, args=(copied,)) threads.append(thread) thread.start() # 全てのスレッドが終了するまで待機 for thread in threads: thread.join() return redirect("bbs:index") index = IndexView.as_view() 1回目は正常に1000個分のスレッドを処 ...
  • ウェブアプリケーションフレームワークを使う前に知っておきたい知識【Django/Laravel/Rails】

    DjangoやLaravel、Ruby on Rails等のウェブアプリケーションフレームワーク(以下、フレームワーク)を使うことで、効率的にウェブアプリの開発ができる。 しかし、前提となる知識をおろそかにしているようでは大したものは作れないし、問題だらけのウェブアプリを知らぬ間に世に出してしまうことになるだろう。 本記事ではフレームワークを扱う際に知っておきたい知識を記す。 ネットワーク ウェブが動く仕組み ま ...
  • 【Django】Windowを使ってレコードの累計値を計算して出力【売上の累計表示、小計(累積)表示などに有効】

    日付でソートして売上を表示するとして、その日付になるまでの累計(累積)売上金額を表示したいとする。 そういう時はWindowを使えば、累計(累積)値を表示させることができる。 ソースコード 前回の月ごとに売上を表示するコードから流用。ビューとテンプレートの処理だけ書き換える。 from django.db.models import Sum,Window,F menus = Menu.objects.annotate(accumulate=Window(Sum("amount"), order_by=[ F("date").desc(),F("id").asc() ] ) ).values("id","name","date","amount","accumulate").order_by("-date","id") 累積計算時(Windowの中)のorder_byとvaluesを実行した後のorder_byは揃えなければ ...
  • 【Django】年、月、日単位でデータをファイリングする時はTruncを使用する【月ごとの売上、個数などの出力に有効】

    ブログなどでよくある、月別アーカイブ。経理でよくある、月ごとの売上記録、年ごとの収支。そういった計算をする時、annotateとTruncを使えば1行で出力できる。 ソースコード モデルがこんな感じ。 from django.db import models class Menu(models.Model): class Meta: db_table = "menu" name = models.CharField(verbose_name="メニュー名",max_length=2000) date = models.DateField(verbos ...
  • 【Django】同一人物による工作(再生数の水増しなど)をいかにして防ぐか、方法と対策【UniqueConstraint,Recaptcha,UA,IPアドレス等】

    例えば、動画サイトを運営していて、動画の再生回数を記録する機能を実装したとする。 動画の検索で、再生数の多い順に並び替えて表示する機能が既にある場合、再生回数の水増しによって、全く面白くない動画が検索の上位に表示されるなどの問題が発生する。 それだけでなく、再生回数の水増しを放置してしまうと、ランキングも荒れ果て、結果的にユーザーが離反してしまう恐れもある。(※ただし、ランキングの集計方法によってある ...