0

このクエリを実行するときに、テーブル内の名前「NULL」を置き換える方法を見つけるために、検索して多くのことを試しました。

SELECT 
YEAR(orderdate) AS Years,
       (CASE WHEN country = 'US' THEN 'US' ELSE 'WORLD' END) AS region,
   SUM(netamount) AS TotSales
FROM orders o JOIN
     customers c 
     ON o.customerid = c.customerid
GROUP BY  (CASE WHEN country = 'US' THEN 'US' ELSE 'WORLD' END),YEAR(orderdate) WITH ROLLUP;

このテーブルを取得します: http://imgur.com/pzHa8fK

Null を「SubTotal」にそれぞれ「GrandTotal」に置き換えたいと思います。私はそれを試しました:

COALESCE(year(orderdate), 'Subtotal') years,...

'IFNULL(...)' と同じですが、名前を置き換える代わりに、すべての年が再度リストされ、NULL がまだ残っている年の余分な列を作成します。

何か案が?

4

1 に答える 1

1

これを行う 1 つの方法は、クエリを別の選択でラップし、null値をCOALESCEまたはCASE式に置き換えることです。

select 
    case 
        when Years is null and region is null then 'GrandTotal'
        when Years is null then 'SubTotal' 
        else Years end Years,
    coalesce(region, '') region,
    TotSales
from
(
    SELECT YEAR(orderdate) AS Years,
       (CASE WHEN country = 'US' THEN 'US' ELSE 'WORLD' END) AS region,
       SUM(netamount) AS TotSales
    FROM orders o JOIN
         customers c 
         ON o.customerid = c.customerid
    GROUP BY  (CASE WHEN country = 'US' THEN 'US' ELSE 'WORLD' END),YEAR(orderdate) WITH ROLLUP
) d

CASE比較する列が複数あるため、式を使用していることに注意してください。

デモで SQL Fiddle を参照してください

于 2013-04-02T17:40:36.237 に答える