16

私は現在SQLについてもっと自分自身を学ぼうとしています。現在、SQL Server 2008データベース内の、、、および関数を使用してSUM、いくつかの簡単な売上レポートを実行しようとしています。各グループの合計、数、平均を行ごとに取得することができました。COUNTAVGGROUP BY

すべてのグループの総計を行ごとに取得するにはどうすればよいですか?

これまでのSQL:

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal,
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice,
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty,
    dbo.tbl_orderitems.txt_orditems_pname
FROM 
    dbo.tbl_orderitems
INNER JOIN 
    dbo.tbl_orders 
    ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders)
WHERE 
    dbo.tbl_orders.uid_order_webid = 
       <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#">
    AND dbo.tbl_orders.txt_order_status = 
       <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#">
GROUP BY
    dbo.tbl_orderitems.txt_orditems_pname
製品数量総平均  

ウェストベリークライミングフレーム178,023.00471.94
サンドポイントデラックスクライムフレーム3436,146.001,063.12
ローズベリークライミングフレーム97,441.00826.78
リッジビューテキサスクライミングフレーム106,990.00699
セルウッドピクニックテーブル9489.9254.44

数量列と総列の合計が必要です

どうもありがとう

ジェイソン

4

3 に答える 3

25

結果セットの最後に総計行を追加するROLLUP演算子を探しています。より複雑な集計合計を探している場合は、@MartinSmithまたはAggregationWITH ROLLUPによって提供されるリンクなど、GROUPBY句を指定したROLLUPまたはCUBEを使用してください。

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal,
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice,
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty,
    dbo.tbl_orderitems.txt_orditems_pname
FROM 
    dbo.tbl_orderitems
INNER JOIN 
    dbo.tbl_orders ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders)
WHERE 
    dbo.tbl_orders.uid_order_webid = <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#">
    AND dbo.tbl_orders.txt_order_status = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#">
GROUP BY
    dbo.tbl_orderitems.txt_orditems_pname
WITH ROLLUP
于 2012-04-29T11:00:05.347 に答える
6

これは古い質問ですが、将来の参考のために、GROUPING SETSを使用して、グループ化プロセスをより細かく制御することもできます。例えば:

SELECT 
    SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal,
    AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS avgPrice,
    count(dbo.tbl_orderitems.uid_orditems_prodid) AS prodQty,
    COALESCE(dbo.tbl_orderitems.txt_orditems_pname, 'TOTAL')
FROM 
    dbo.tbl_orderitems
INNER JOIN 
    dbo.tbl_orders 
    ON (dbo.tbl_orderitems.uid_orditems_orderid = dbo.tbl_orders.uid_orders)
WHERE 
    dbo.tbl_orders.uid_order_webid = 
       <cfqueryparam cfsqltype="cf_sql_integer" value="#session.webid#">
    AND dbo.tbl_orders.txt_order_status = 
       <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.sale_status#">
GROUP BY GROUPING SETS (
    (dbo.tbl_orderitems.txt_orditems_pname),
    ()
)

このようにすると、結果には両方の行がtxt_orditems_pnameでグループ化され、グループ化はまったく行われません。より多くのグループ化セットを指定できます。部門とチームの平均給与のクエリ。部門と会社全体の合計も返されます。

于 2015-02-13T07:06:35.310 に答える
1

選択範囲を別の選択範囲でラップし、列を合計します。

于 2012-04-29T10:25:36.793 に答える