Sql 使用“分组方式”获取总计

Sql 使用“分组方式”获取总计,sql,sql-server-2008,Sql,Sql Server 2008,目前,我正在尝试自学更多有关SQL的知识,目前正在尝试使用SQL Server 2008数据库中的SUM、COUNT、AVG和GROUP BY函数执行一些简单的销售报告。我已设法按行计算出每组的总数、计数和平均数 如何按行计算所有组的总计 到目前为止: SELECT SUM(dbo.tbl_orderitems.mon_orditems_pprice) AS prodTotal, AVG(dbo.tbl_orderitems.mon_orditems_pprice) AS av

目前,我正在尝试自学更多有关SQL的知识,目前正在尝试使用SQL Server 2008数据库中的
SUM
COUNT
AVG
GROUP BY
函数执行一些简单的销售报告。我已设法按行计算出每组的总数、计数和平均数

如何按行计算所有组的总计

到目前为止:

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
选择
总计(dbo.tbl\u orderitems.mon\u orderitems\u pprice)作为prodTotal,
作为平均价格的平均值(dbo.tbl\u orderitems.mon\u orderitems\u pprice),
将(dbo.tbl\u orderitems.uid\u orderitems\u prodid)计数为prodQty,
dbo.tbl_orderitems.txt_orderitems_pname
从…起
dbo.tbl_订单项
内连接
dbo.tbl_订单
ON(dbo.tbl\u orderitems.uid\u orderid=dbo.tbl\u orders.uid\u orders)
哪里
dbo.tbl_orders.uid_order_webid=
和dbo.tbl_orders.txt_order_status=
分组
dbo.tbl_orderitems.txt_orderitems_pname
平均总产品数量 Westbury攀爬架17 8023.00 471.94 Sandpoint豪华攀岩架34 36146.00 1063.12 Roseberry攀爬架9 7441.00 826.78 Ridgeview德克萨斯攀岩架10 6990.00 699 塞尔伍德野餐表9 489.92 54.44 我需要数量列和总额列的合计 非常感谢


Jason

将您的选择包装到另一个选择中,并对列进行汇总。

您正在寻找将在结果集末尾添加总计行的运算符。如果您要查找更复杂的聚合总计,请使用ROLLUP或CUBE以及GROUP BY子句,例如@MartinSmith或提供的链接

选择
总计(dbo.tbl\u orderitems.mon\u orderitems\u pprice)作为prodTotal,
作为平均价格的平均值(dbo.tbl\u orderitems.mon\u orderitems\u pprice),
将(dbo.tbl\u orderitems.uid\u orderitems\u prodid)计数为prodQty,
dbo.tbl_orderitems.txt_orderitems_pname
从…起
dbo.tbl_订单项
内连接
dbo.tbl_订单打开(dbo.tbl_orderitems.uid_orderitems_orderid=dbo.tbl_orders.uid_orders)
哪里
dbo.tbl_orders.uid_order_webid=
和dbo.tbl_orders.txt_order_status=
分组
dbo.tbl_orderitems.txt_orderitems_pname
带卷

我知道这是一个老问题,但仅供将来参考-您还可以通过使用分组集对分组过程进行更多控制。例如:

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),
    ()
)
选择
总计(dbo.tbl\u orderitems.mon\u orderitems\u pprice)作为prodTotal,
作为平均价格的平均值(dbo.tbl\u orderitems.mon\u orderitems\u pprice),
将(dbo.tbl\u orderitems.uid\u orderitems\u prodid)计数为prodQty,
合并(dbo.tbl_orderitems.txt_orderitems_pname,'TOTAL')
从…起
dbo.tbl_订单项
内连接
dbo.tbl_订单
ON(dbo.tbl\u orderitems.uid\u orderid=dbo.tbl\u orders.uid\u orders)
哪里
dbo.tbl_orders.uid_order_webid=
和dbo.tbl_orders.txt_order_status=
按分组集分组(
(dbo.tbl_orderitems.txt_orderitems_pname),
()
)

这样,结果将按txt\u或TEMS\u pname对两行进行分组,并且根本不进行分组。您可以指定更多的分组集,即查询部门和团队的平均工资,并返回部门和整个公司的总计。

您能举一个您想要的输出示例吗?我不太明白你在愚蠢之后是什么意思抱歉,但是我该如何将选项卡式数据引入问题?@jasonangerton-将其格式化为代码以使其保留间距。只需注意一点:带有汇总的
和带有多维数据集的
功能已被弃用,建议避免使用。(请参阅的非ISO兼容语法部分。)您可以使用
ROLLUP()
来代替:
按汇总分组(dbo.tbl\u orderitems.txt\u orderitems\u pname)
。这很好,martin smith提供的汇总信息对我接下来的步骤很有帮助-谢谢大家
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
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),
    ()
)