2011-01-04 6 views
0

最下行の列の合計を取得しようとしています。 SUM()とCOUNT()を使用していくつかの例を試しましたが、構文エラーですべてが失敗しました。最下行のSQLクエリの合計

:XML ON 
USE MYTABLE 
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName ORDER BY namn ASC 
FOR XML PATH ('celler'), ROOT('root') 
GO 

XML出力は通常のHTMLテーブルになるために再フォーマットされています

は、ここで任意の和または何もせずに私の現在のコードです。

EDIT:ここ

が最新のコードであり、それは他のすべての行の「和」(上の行と同じ数)を生成する:

:XML ON 
USE MYTABLE 
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName with rollup 
FOR XML PATH ('celler'), ROOT('root') 
GO 

XML出力がどのように見えますこの:

<root> 
<celler> 
<namn>example name one</namn> 
<cnt>23</cnt> 
</celler> 
<celler> 
<cnt>23</cnt> 
</celler> 
<celler> 
<namn>example name two</namn> 
<cnt>1</cnt> 
</celler> 
<celler> 
<cnt>1</cnt> 
</celler> 
</root> 
+0

それは構文エラーで失敗した場合、エラーを投稿してくださいあまりにも。 –

答えて

1

てみ

SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName 
UNION 
SELECT 'TOTAL' as nawn,COUNT(*) as cnt 
FROM 
FROM sbc.AgentC, sbc.PolicyC 
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid 
ORDER BY namn ASC 

これは、別のクエリで合計を計算します。しかし、印刷していない高ASCII文字を追加して合計を強制するか、数字の順序キーを追加する必要があるかもしれません... mySQLには、(Microsoft SQLのWITH ROLLUPに似た)演算子もあります。上記のコードよりも効率的です...これはうまくいくでしょうが、おそらくもっと効率的なオプションがあります。

+0

私はFOR XMLがユニオンの後で動作することを確認することができます(少なくとも私のT-SQL上では、これもMySQLでもうまくいきますように) – Vlagged

1

MySQLはグループ化するrollup extensionをサポートしています。

select * from parts; 
+-----------+--------+ 
| part_name | amount | 
+-----------+--------+ 
| upper  | 100 | 
| lower  | 100 | 
| left  |  50 | 
| right  |  50 | 
+-----------+--------+ 

select part_name 
     ,sum(amount) 
    from parts 
group 
    by part_name with rollup; 

+-----------+-------------+ 
| part_name | sum(amount) | 
+-----------+-------------+ 
| left  |   50 | 
| lower  |   100 | 
| right  |   50 | 
| upper  |   100 | 
| NULL  |   300 | 
+-----------+-------------+ 

はコメントに答えるために更新:

次の項目は、ROLLUPのMySQLの 実装に固有のいくつかの 行動リスト:

あなたはROLLUPを使用するときは、することはできませんも 使用をORDER BY句を使用して 結果をソートします。つまり、ROLLUPと ORDER BYは相互に排他的です。 しかし、あなたは依然としていくつかのコントロールを持っています。 をソート順にオーバーしてください。 の結果をソートし、 明示的なASCとDESCキーワードを使用して、 のGROUP BYリストで指定されたカラムを に設定し、個々の カラムのソート順を指定することができます。 (まだかかわらずソート 順の、彼らは が計算され、そこから行の後 を表示さROLLUPによって追加上位レベルの概要 行。)

+1

mySQLはWITH ROLLUPをサポートしているので、これは私が推奨するUNIONアプローチよりも優れた解決方法です。ありがとうRonnis ... mySQLはNULLを自動的に一番下に並べますか? – Sparky

+0

"with rollup"コードを追加しましたが、構文エラーは発生しません。しかし、表全体が集計される代わりに、セル内の他のすべての行に合計が表示されます。それは上記の行と同じ数字です。私はそれがFOR XMLが入力を処理する方法と関係していると思います。私はこれが実際にどのように機能するかについて非常に限られた知識しか持っておらず、どのように進むべきかわかりません。しかし、私はオリジナルの投稿に最新の結果を投稿しました。 – jman

+0

@nctrnl、私はFOR XMLを使ったことがないので、わかりません:( – Ronnis

関連する問題