【问题标题】:Getting Grand Totals using Group By使用 Group By 获取总计
【发布时间】:2012-04-29 10:22:24
【问题描述】:

目前我正在尝试自学更多关于 SQL 的知识,并且目前正在尝试使用 SQL Server 2008 数据库中的 SUM、COUNT、AVG 和 GROUP 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
产品数量总平均 韦斯特伯里攀爬架 17 8,023.00 471.94 Sandpoint 豪华攀爬架 34 36,146.00 1,063.12 Roseberry 攀爬架 9 7,441.00 826.78 Ridgeview Texas 攀爬架 10 6,990.00 699 塞尔伍德野餐桌 9 489.92 54.44 我需要 qty 列和 Gross 列的总计

非常感谢

杰森

【问题讨论】:

  • 你能举一个你想要的输出的例子吗?我不太明白你在追求什么
  • 愚蠢抱歉,但我如何将选项卡式数据放入问题中?
  • @JasonCongerton - 将其格式化为代码以使其保留间距。

标签: sql sql-server-2008


【解决方案1】:

您正在寻找ROLLUP 运算符,它将在结果集的末尾添加一个总计行。如果您正在寻找更复杂的汇总总计,请使用带有 GROUP BY 子句的 ROLLUP 或 CUBE,例如 @MartinSmith 或 Aggregation WITH ROLLUP 提供的链接

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

【讨论】:

  • 请注意:WITH ROLLUP 和 WITH CUBE 功能已弃用,建议避免使用。 (请参阅this manual page 的 非 ISO 兼容语法 部分。)您可以改用 ROLLUP():GROUP BY ROLLUP(dbo.tbl_orderitems.txt_orditems_pname)。
  • 效果很好,并且来自 martin smith 的汇总信息对我的后续步骤很有帮助 - 谢谢大家
【解决方案2】:

我知道这是一个老问题,但仅供将来参考 - 您还可以通过使用 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 分组,并且根本没有分组。您可以指定更多的分组集,即。一个部门和团队的平均工资查询,同时返回了部门和整个公司的总和。

【讨论】:

    【解决方案3】:

    将您的选择包装在另一个选择中并总结列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多