メインコンテンツにスキップ
モジュール 6 · レッスン 3 / 4コース内の 23/57~10 min
モジュールのレッスン (3/4)

数値関数

PostgreSQL には、期待されるすべての数値関数に加えて、いくつかの関数が備わっています。 タイプの落とし穴は、すぐに知っておく価値があります。

よく使われる機能

SQL
ROUND(price, 2)     -- arrotonda a 2 decimali (banker's rounding "half to even")
CEIL(price)         -- arrotonda per eccesso (verso +∞)
FLOOR(price)        -- arrotonda per difetto (verso −∞)
ABS(-5)             -- 5  (valore assoluto)
MOD(10, 3)          -- 1  (resto della divisione)  — anche 10 % 3
POWER(2, 10)        -- 1024
SQRT(16)            -- 4

ROUND(number, decimals) は、number が NUMERIC (そうではない場合) の場合にのみ機能します。 DOUBLE PRECISION)。データセットでは products.price は NUMERIC(10,2) です。 すでに準備は整っています。

整数の除算と小数の除算

古典的な落とし穴:

SQL
SELECT 1 / 2;          -- 0  (entrambi interi → divisione intera!)
SELECT 1.0 / 2;        -- 0.5
SELECT 1::numeric / 2; -- 0.50000000000000000000

2 つの INTEGER 列を分割すると、INTEGER が得られます。避けるために 切り捨て、そのうちの 1 つを NUMERIC にキャストするか、1.0 で乗算します。

SQL
-- Sbagliato: percentuale sempre 0 finché numeratore < denominatore
SELECT shipped / total FROM …;

-- Corretto:
SELECT shipped::numeric / total FROM …;
SELECT ROUND(shipped * 100.0 / total, 2) AS percentage FROM …;

データセットの例

SQL
-- Prezzo scontato del 10%, arrotondato a 2 decimali:
SELECT name,
       price,
       ROUND(price * 0.9, 2) AS discounted_price
FROM   products
ORDER BY id;

-- Prezzo "psicologico" sempre arrotondato per eccesso al multiplo di 1:
SELECT name, CEIL(price) AS rounded_price
FROM   products
WHERE  price < 100
ORDER BY price;

試してみてください

運動#sql.m6.l3.e1
試行回数: 0読み込み中…

各製品について、名前、価格 (元の価格)、およびdiscount_price (10% 割引された価格、小数点第 2 位を四捨五入) が表示されます。 IDで注文します。

エディターを読み込み中…
ヒントを表示

0.9 を乗算して価格を 10% 引き下げ、ROUND(..., 2) で丸めます。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m6.l3.e2
試行回数: 0読み込み中…

配達された各注文 (ステータス = '配達済み') について、id と wait_days を、ordered_at と Shipped_at の間の整数の日数 (切り捨て) として表示します。 wait_days の降順で並べてから、ID で並べ替えます。

エディターを読み込み中…
ヒントを表示

shipped_at - ordered_at returns an INTERVAL; EXTRACT(EPOCH FROM …) turns it into seconds; divide by 86400 (seconds in a day) and take the FLOOR.

3 回の試行後に解決策が利用可能になります