【问题标题】:How I can two subtotals summarize in the table SQL Server Managment Studio 2014?如何在 SQL Server Management Studio 2014 表中汇总两个小计?
【发布时间】:2021-12-29 22:27:12
【问题描述】:

我有一个 SQL 查询,它返回 orderidquantity 为所有带有 orderid >= 11075orderid <= 11076 的订单排序:

select orderid, quantity 
    from [order details]
where ((orderid >= 11075) AND (orderid <= 11076))

我的结果集是:

但我的表中需要小计。我需要生成一个控制中断报告,提供订单号 11075 和 11076 的总量。COMPUTECOMPUTE BY 在我的 SQL Server 版本中不起作用。我该如何实现?

这样的表格:

table, th, td {
  border: 1px solid black;
}
<table>
  <tr>
    <th>orderid</th>
    <th>quantity</th>
  </tr>
  <tr>
    <td>11075</td>
    <td>10</td>
  </tr>
  <tr>
    <td>11075</td>
    <td>30</td>
  </tr>
   <tr>
    <td>11075</td>
    <td>2</td>
  </tr>
  <tr>
    <td></td>
    <td>Sum</td>
  </tr>
  <tr>
    <td></td>
    <td>=======</td>
  </tr>
  <tr>
    <td></td>
    <td>42</td>
  </tr>
  <tr>
    <td> </td>
    <td> </td>
  </tr>
  <tr>
    <td>11076</td>
    <td>20</td>
  </tr>
  <tr>
    <td>11076</td>
    <td>20</td>
  </tr>
  <tr>
    <td>11076</td>
    <td>10</td>
  </tr>
  <tr>
    <td></td>
    <td>Sum</td>
  </tr>
  <tr>
    <td></td>
    <td>===========</td>
  </tr>
  <tr>
    <td></td>
    <td>50</td>
  </tr>
</table>

【问题讨论】:

  • 这看起来像是一个演示问题。应该在您的前端应用程序中而不是在SQL Server 中执行此操作
  • @Squirrel 我没有网络应用程序。这是我想在运行查询时输出的表示例。

标签: sql sql-server database datatable subtotal


【解决方案1】:

您可以使用GROUPING SETS 和一些有条件的反透视生成您想要的结果

SELECT
  v.orderid,
  v.quantity
FROM (
    SELECT
      orderid,
      quantity = SUM(quantity),
      grouping = GROUPING(quantity)
    FROM YourTable t
    GROUP BY GROUPING SETS
      (
        (orderid, quantity),
        (orderid)
      )
) t
CROSS APPLY (
    SELECT *
    FROM (VALUES
        (NULL, 'SUM', 1),
        (NULL, '====', 2),
        (NULL, '', 4)
    ) v(orderid, quantity, ordering)
    WHERE t.grouping = 1
    UNION ALL
    SELECT
      CASE WHEN t.grouping = 0 THEN t.orderid END,
      CAST(t.quantity AS varchar(20)),
      3
) v
ORDER BY
  t.orderid,
  t.grouping,
  v.ordering;

db<>fiddle

要创建您想要的表格,您可以使用FOR XML,但它会非常复杂,而且用另一种语言可能更容易完成。

【讨论】:

    【解决方案2】:

    正如其他人评论的那样,这似乎更像是一个演示问题。

    但是,您可以使用ROW_NUMER()GROUP BY ROLLUP 构建一个生成与您想要的结果相似的查询:

      select orderid
           , case when orderid is null then'grand total' else isnull(try_convert(varchar,rn),'subtotal') end as rn
           , sum(quantity) as quantity
        from (
               select *, ROW_NUMBER() OVER (partition by orderid order by orderid) as rn
                 from order_details
                where ((orderid >= 11075) AND (orderid <= 11076)) 
             ) tmp
    group by rollup (orderid, rn);
    

    这还将包括最后的总计行。

    orderid rn quantity
    11075 1 10
    11075 2 30
    11075 3 2
    11075 subtotal 42
    11076 1 20
    11076 2 20
    11076 3 10
    11076 subtotal 50
    grand total 92

    注意:如果您在每个 orderid 中已经有某种唯一的其他列,例如唯一的 id 列,您也可以省略 ROW_NUMBER() 并使用该列而不是 rn直接在GROUP BY ROLLUP中。

    this db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2016-04-20
      相关资源
      最近更新 更多