SQL問題 欠損したPOSデータの値を埋める

問題:12月2日にカテゴリ2のデータがPOSデータに入らないトラブルが起きたので、次のデータをPOSに追加したテーブルを作ること。

category_iditem_idquantitycustomer_id
21410
22215

kiso1の5つExcelファイルにあるテーブル5つから必要なデータを選ぶこと。 使い方はSQL学習用サンプルデータを参照。

1つのクエリでも書けるが慣れないうちはまずこのデータが入った2レコードのテーブルを作ることを考えよう。

解答:結合したテーブルをSELECTして追加されていることが確かめられれば良い。

解説:追加するテーブルをサブクエリで先に作るようにすると

WITH loss as
(
SELECT '2019-12-02’ as date , 2 as category_id,1 as item_id ,4 as quantity,10 as customer_id
UNION ALL
SELECT '2019-12-02’ as date , 2 as category_id,2 as item_id ,2 as quantity,15 as customer_id
)
SELECT * FROM FROM kiso1_pos
UNION ALL
SELECT * FROM loss

これはエラーになる。エラーメッセージを見ると「Column 1 in UNION ALL has incompatible types: DATE, STRING」となっておりつまり「最初のカラムの型が違うからUNIONできない」と言われているので、サブクエリの中かUNIONする時にCASTでDATE型に変換する必要がある。

サブクエリを使わずに直接書くとこうなる。UNION ALLで1行づつ直接追加している。

SELECT * FROM kiso1_pos
UNION ALL
SELECT '2019-12-02’ as date , 2 as category_id,1 as item_id ,4 as quantity,10 as customer_id
UNION ALL
SELECT '2019-12-02’ as date , 2 as category_id,2 as item_id ,2 as quantity,15 as customer_id

この場合は型が違うというエラーにはならない。実行してみて初めて気づくこともあるので、型が違うエラーがデータ場合はCASTで変換する。

SL問題一覧はこちら

2020年2月15日SQL問題

Posted by shinu