0

カスタム列名を作成するクエリがあります。同じテーブルの最後に、これらのカスタム列のすべてのエントリを合計する行が必要です。たとえば、私は持っています:

SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
    IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference 
FROM...

BudgetAmount列とDIfference列の合計を含む列が必要です。それ、どうやったら出来るの?

4

4 に答える 4

1

これは、アプリ側の要約に適した候補のように思えます。ただし、本当にMySQLでのみ実行したい場合は、基本的に3つのオプションがあると思います。

  1. ストアドプロシージャを記述します。
  2. 他の人が示唆しているように、それUNIONを実行します。これには、基本的に同じサブクエリを1つのステートメントに2回入れる必要があります。
  3. GROUP BY ... WITH ROLLUP 構文を試してください。SELECTたとえば、に一意のキーが含まれていると仮定しますsomeUniqueID。そのIDでグループ化する必要があり(したがって、各グループに1つの行のみが存在します)、rollup句を使用して追加の行を追加します。ID列はNULLロールアップ行に表示されます。

完全なクエリとテーブル構造に応じて、ステートメントは次のようになります。

SELECT someUniqueID, ... , IFNULL(SUM(bl.amount), '---') AS BudgetAmount, 
    IFNULL( SUM( (bl.amount *1) - ( + bal1.amount ) ), '---') AS Difference 
FROM ...
GROUP BY someUniqueID
WITH ROLLUP
于 2012-12-11T17:13:20.710 に答える
1

これを行う簡単な方法の 1 つは、元のクエリをインライン ビューとして使用し、インライン ビューを行ソースとして使用して SELECT ステートメントを記述することです。(MySQL の用語では、インライン ビューは派生テーブルと呼ばれます):

SELECT v.BudgetAmount
     , v.Difference
     , v.BudgetAmount + v.Difference AS Total
  FROM (
         -- original query here
         SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
                IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference 
           FROM...
       ) v

他のリレーショナル データベース システムとは異なり、MySQL は実際にインライン ビューを具体化することを強制し (つまり、インライン ビューのクエリが実行され、結果が MyISAM テーブルとして保存されます)、パフォーマンスに影響します。

ただし、これは、他の式で使用する列の別名を参照できる方法です。

(列に割り当てられたエイリアスは、それらが割り当てられている SELECT リストでは参照できません...クエリの HAVING および ORDER BY 句でのみ参照できます。)

単一のクエリで別の列に追加されたこれらの列の値を取得するには、エイリアスを参照できません。次のように式を繰り返す必要があります。

SELECT expr1          AS BudgetAmount
     , expr2          AS Difference
     , expr1 + expr2  AS Total 
  FROM ...

エイリアスを参照するには、インライン ビューなど、クエリによって参照される行ソースから取得する必要があります。

SELECT v.BudgetAmount
     , v.Difference
     , v.foo
     , v.BudgetAmount + v.Difference AS Total
  FROM (  SELECT expr1 AS BudgetAmount
               , expr2 AS Difference
               , foo
            FROM ...
       ) v

それがあなたが聞きたかった答えかどうかはわかりませんが、それがその方法です。


編集:

私はあなたが尋ねていることを誤解しました。あなたの質問は、「合計が...の列が欲しい」と言っていました。これは、結果セットに追加の ROW を追加したいという意味ではなく、同じ数の行を返すクエリが必要だったという意味だと思いました。

于 2012-12-10T23:08:57.800 に答える
1

これを使用できると思います:

SELECT ... IFNULL(bl.amount, '---') AS BudgetAmount, 
    IFNULL((bl.amount *1) - ( + bal1.amount ), '---') AS Difference,
    IFNULL(bl.amount, 0) + IFNULL((bl.amount *1) - ( + bal1.amount ), 0) AS NewCol
FROM...

または、もっと説明できますか

于 2012-12-10T22:47:54.500 に答える
0

アプリケーション側でこれを行う必要があるようです。UNION ALLただし、最後に使用して「すべてのエントリの合計」をスタックすることができます。列が整列していることを確認してください。

SELECT amount, balance
FROM table
UNION ALL
SELECT IFNULL(SUM(amount), '---') AS BudgetAmount, 
    IFNULL(SUM(...)) AS Difference
FROM table
于 2012-12-10T22:23:52.897 に答える