ray88’s diary

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

SQL 数値型から日付型への変換②

SQL文の中で、LPAD という関数を使用しています。これは左側に特定の文字を埋めるための関数です。month が1桁の場合(例: 4月)、LPAD を使用して 04 という2桁の形式に変換します。その後、year と month を連結して日付形式に変換しています。
PostgreSQL

SELECT
    section1,
    section2,
    TO_DATE(year || '-' || LPAD(month::text, 2, '0'), 'YYYY-MM') as converted_month,
    SUM(amount) as total_amount
FROM
    workexpenses
WHERE
    (section1 = 'C' AND section2 IN ('Z', 'Y', 'X'))
GROUP BY
    section1, section2, converted_month
ORDER BY
    section1, section2, converted_month;

MySQL

SELECT
    section1,
    section2,
    STR_TO_DATE(CONCAT(year, '-', LPAD(month, 2, '0')), '%Y-%m') as converted_month,
    SUM(amount) as total_amount
FROM
    workexpenses
WHERE
    (section1 = 'C' AND section2 IN ('Z', 'Y', 'X'))
GROUP BY
    section1, section2, converted_month
ORDER BY
    section1, section2, converted_month;

【テストデータ作成用】

-- テーブルの作成
CREATE TABLE workexpenses_separated (
    no SERIAL PRIMARY KEY,
    section1 CHAR(1),
    section2 CHAR(1),
    year INTEGER,
    month INTEGER,
    amount INTEGER
);

-- テストデータの挿入
INSERT INTO workexpenses_separated (section1, section2, year, month, amount) VALUES
('C', 'Z', 2022, 4, 1000),
('C', 'Z', 2022, 5, 1500),
('C', 'Z', 2022, 6, 2000),
('C', 'Y', 2022, 4, 1200),
('C', 'Y', 2022, 5, 1300),
('C', 'X', 2022, 4, 1400),
('C', 'X', 2022, 6, 1700),
('D', 'W', 2022, 4, 900),
('D', 'W', 2022, 5, 800);