3

SQL ステートメントに group by 句があり、Sum() 関数のように追加するのではなく、集計関数を使用して各グループのすべての値を差し引く必要があります。

すなわち

SELECT Sum(A) 
FROM (  
  SELECT 2 AS A
  UNION 
  SELECT 1) AS t1

..so は 2+1 を評価して 3 を返します。

1を返すために2-1を行う何らかの方法が必要です。

これが理にかなっていることを願っています。これを行う唯一の方法は、CLR 統合を使用して独自の集計関数を作成することです。

他のアイデアはありますか?

4

5 に答える 5

2

あなたの質問からは、あなたが何をしたいのか正確にはわかりません。すべての値の合計が負であるかのように求める場合は、SUM() を実行し、-1 を掛けて負の結果を返すことができます。

あなたの例では、テーブルの最初の行の合計から他のすべての値を引いたものを取得したいようです。したがって、値が 10、15、5、20 の場合は、10 - 15 - 5 - 20 になります。この値は 10 - (15 + 5 + 20) と同じです。LIMIT を使用してテーブルの最初の行を取得できます。次の段階で主キーも必要になります。

SELECT primary_key AS pk, field FROM table LIMIT 1;

上記の行を除外することで、他のすべての行の合計を取得できます。

SELECT SUM(field) FROM table WHERE primary_key != pk;

その後、最初の値から 2 番目の値を引くことができます。

于 2008-11-11T10:38:06.813 に答える
2

あなたのコメントを読んで、私はあなたがこのようなものが欲しいと思います:

SELECT SUM(CASE WHEN ROWNUM=1 THEN 2*A ELSE -A END) 
FROM foo

信頼性の高い順序付けを行うには、おそらく別の選択を使用する必要があります。

SELECT SUM(b) 
FROM (
  SELECT CASE WHEN ROWNUM=1 THEN 2*a ELSE -a END AS b
  FROM foo
  ORDER BY ???
);
于 2008-11-11T14:49:56.213 に答える
2

差し引く項目をどのように特定しますか?

それが識別されると、その値がSUM()乗算され-1て加算されます。

編集:

それが減算される最初の値である場合は、その値を取得し、それを 2 倍にしてから、すべての値の合計を取得します。(2 倍にすると、すべての値の合計に含める効果が相殺されます。)

select top 1 @var = [value]
from myTable 
order by [some condition] 

select @minused = (2 * @var)  - sum([value]) 
from myTable 
于 2008-11-11T10:12:56.037 に答える
0

SUM() は 2+1 == 1+2 のように機能しますが、2-1 != 1-2 のように機能するため、そのような関数は、ORDER BY が変更された場合に異なる結果を生成します (存在する場合)。

于 2008-11-11T10:13:39.983 に答える
0

なぜこれが必要なのかわかりませんが、返されたデータの負の値を合計するだけです。

SELECT Sum(A) 
FROM (  
  SELECT (2 * -1) AS A
  UNION 
  SELECT (1)) AS t1
于 2008-11-11T10:15:23.270 に答える