読者です 読者をやめる 読者になる 読者になる

ちょっと変わった (?) 小計の求め方

小計行を出したい場合は ROLLUP やら CUBE やらを使うのが普通なんだろうけど、それらが使えない環境というものもあるわけで・・・*1 *2
で、効率無視してでも出したい場合、以下のように書けばいい。

-- 明細行と
SELECT
    Customer.id
  , Customer.name
  , Item.id
  , Item.name
  , Item.price
  , Account.quantity
  , Account.quantity * Item.price
  , Account.remark
FROM
    Customers Customer
      INNER JOIN Accounts Account ON Customer.id = Account.c_id
      INNER JOIN Items Item ON Account.i_id = Item.id
UNION ALL
-- 小計行をUNION ALLでくっつけて
SELECT
    Customer.id
  , Customer.name + N' 小計'
  , NULL
  , ''
  , NULL
  , SUM(Account.quantity)
  , SUM(Account.quantity * Item.price)
  , ''
FROM
    Customers Customer
      INNER JOIN Accounts Account ON Customer.id = Account.c_id
      INNER JOIN Items Item ON Account.i_id = Item.id
GROUP BY
    Customer.id
  , Customer.name
-- 全体をORDER BY
ORDER BY
    Customer.id
  , Customer.name
;

SQL でしかカスタマイズできないと、なにかとつらい。

*1:RDBMS が対応してても、その上に乗っかってるアプリが対応してなかったり。今回はそれ

*2:*1 で「今回はそれ」と言ったにもかかわらず、ROLLUP も CUBE も実際に使ったことないのは内緒。