Sql server 2012 使用COMPUTE和computeby的SQL汇总查询

Sql server 2012 使用COMPUTE和computeby的SQL汇总查询,sql-server-2012,Sql Server 2012,我有一个包含两列FileExtension和FileSize的表,如下所示: FileType FileSize --------------------------- dll 129 bak 2323 ext 242424 ini 40 bak 532 log 32 bak 3253 dll 9094 bak 234 txt 587 dll 1000 我正在尝试编写一个SQL查询,可

我有一个包含两列FileExtension和FileSize的表,如下所示:

FileType FileSize
---------------------------
dll      129
bak      2323
ext      242424
ini      40
bak      532
log      32
bak      3253
dll      9094
bak      234
txt      587
dll      1000
我正在尝试编写一个SQL查询,可能使用汇总(ROLLUP)或COMPUTE的组合,它将根据最大的文件大小提供FileTypes列中的前3个值。报告底部将包含一个“总计”列,该列提供“文件大小”列中所有值的总和。查询结果类似于:

FileType    FileExtension
-------------------------------
ext         242424
dll         10223
bak         6342
Total       259648
任何关于如何完成此查询的想法都将不胜感激。谢谢

这是基本分组:

;with cte as (
select top 3 FileType, sum(FileSize) as FileExtension 
from TableName
group by FileType
order by FileExtension desc
)
select * from cte
union all
select 'Total', sum(FileExtension) from cte
如果我理解正确:

;with cte as (
    select top 3 FileType, sum(FileSize) as FileExtension 
    from TableName
    group by FileType
    order by FileExtension desc
    )
    select * from cte
    union all
    select 'Total', sum(FileSize) from TableName
您可以在单个查询中获得每个文件类型的总文件大小值和总文件大小,如下所示:

SELECT
  FileType,
  TotalSize = SUM(FileSize)
FROM
  dbo.YourTable
GROUP BY
  ROLLUP(FileType)
;
作为汇总分组函数的结果,您将有一个额外的行,TotalSize值是所有单个TotalSize值和FileType的总和,设置为NULL

要仅获取前三名总计和总计,只需按TotalSize的降序对结果进行排序,然后将前四名添加到SELECT子句:

SELECT TOP (4)
  FileType,
  TotalSize = SUM(FileSize)
FROM
  dbo.YourTable
GROUP BY
  ROLLUP(FileType)
ORDER BY
  TotalSize DESC
;
外部查询的第一个排序条件是一个大小写表达式,根据其文件类型为null的事实,它对总计行的计算结果为1,对其他行的计算结果为0。该结果的升序确保总计行位于集合的底部

请注意,如果FileType列本身有NULL,那么如果NULL结果是前三名之一,则上述查询将无法正常工作。然后,您需要一种方法来区分来自源数据集的NULL和由ROLLUP函数生成的NULL。这是您可以使用函数的地方

指示是否聚合GROUP BY列表中的指定列表达式。分组在结果集中为聚合返回1,为未聚合返回0

因此,如果GROUPINGFileType返回1,则为汇总行,否则为文件类型小计。该函数的结果可以很容易地用于将列值替换为“总计”,并将结果排序为最终输出。唯一的问题是,由于函数仅在GROUP BY查询的直接上下文中才有意义,但函数结果的排序将在稍后阶段执行,因此您可能需要将这些结果作为派生表的一列返回以供以后使用。以下内容具体说明了如何:

SELECT
  FileType = CASE IsRollup WHEN 1 THEN 'Total' ELSE FileType END,
  TotalSize
FROM
  (
    SELECT TOP (4)
      FileType,
      TotalSize = SUM(FileSize),
      IsRollup  = GROUPING(FileType)
    FROM
      dbo.YourTable
    GROUP BY
      ROLLUP(FileType)
    ORDER BY
      TotalSize DESC
  ) AS s
ORDER BY
  IsRollup  ASC,
  TotalSize DESC
;

不,总数应该是整个表的。这个查询很好,几乎就是我需要的。有没有办法获取最后一行“总计”的“文件大小”列中所有值的总和?@MelissaB,如果我没有错,请参阅更新的答案您需要前3行,但所有行的总和。谢谢!这正是我所需要的。您可以使用该函数来区分分组列和可能的空值。这比使用合并要清楚得多。排序语句也是如此。@TT:是的,我知道这个函数。对于这种特殊情况,空检查似乎已经足够了,但一般来说,显示使用汇总行的正确方法是有意义的。所以,我以后可能会更新我的答案,谢谢你提出这个问题。
SELECT
  FileType = CASE IsRollup WHEN 1 THEN 'Total' ELSE FileType END,
  TotalSize
FROM
  (
    SELECT TOP (4)
      FileType,
      TotalSize = SUM(FileSize),
      IsRollup  = GROUPING(FileType)
    FROM
      dbo.YourTable
    GROUP BY
      ROLLUP(FileType)
    ORDER BY
      TotalSize DESC
  ) AS s
ORDER BY
  IsRollup  ASC,
  TotalSize DESC
;