sql server选择聚合函数

uujelgoq  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(293)

我有一个关于在where语句中使用聚合函数的问题。

SELECT [tb_users].[id_user]
      ,[name]
      ,[Title]
      ,[FirstName]
      ,[LastName]
      ,[type]
      ,sum ([tb_LockAuditTrail].[price]) as SumPrice
  FROM [SALTO_SPACE].[dbo].[tb_Users]
  join [tb_LockAuditTrail]
  on [tb_Users].[Cardcode] = [tb_LockAuditTrail].[Cardcode]

  where [type] = 1 
   group by [tb_users].[id_user]
      ,[name]
      ,[Title]
      ,[FirstName]
      ,[LastName]
      ,[type]
  order by [SumPrice] desc

一切正常。从这个数据集中,我只想选择高于某个特定值的记录 SumPrice 水平。我该怎么做?
我不能用这个别名 SumPrice 因为在where语句中不允许使用别名 where 声明。
我也不能使用聚合 SUM 在where语句中的函数。因此,目前除了在excel工作表中过滤结果之外,我没有看到其他解决方案。

tkclm6bt

tkclm6bt1#

在group by block之后和orderby block之前写入

HAVING sum ([tb_LockAuditTrail].[price]) > 100

相应地更改100
即使拥有不是一件事,你也不必使用excel。每个select都会创建一个数据块,这些数据块可以像表一样使用,因此您可以将其全部用括号括起来,给它一个别名,然后像从表中选择一样从查询中进行选择:

SELECT *
FROM
(
  SELECT productcategory, sum(price) as sumprice
  FROM products
  GROUP BY productcategory
) summed
WHERE
  summed.sumprice > 100

开始接受这样一个概念:表只是查询可以使用的一种“数据块”;如果您记住,您可以使用来自其他源(如查询和表值函数)的数据块,那么您的sql查询能力将大大提高。下面是另一个例子:

SELECT *
  FROM

    products p

    INNER JOIN
    (
      SELECT productcategory, sum(price) as sumprice
      FROM products
      GROUP BY productcategory
    ) sumcat
    ON p.productcategory = sumcat.productcategory

    INNER JOIN 
    (
      SELECT warehouse, count(*) as sumprice
      FROM products
      GROUP BY warehouse
    ) countwh
    ON p.warehouse = countwh.warehouse

  WHERE
    ...

您还可以使用with命令对查询进行别名,以便将其用作表:

WITH 
    sumcat AS (
      SELECT productcategory, sum(price) as sumprice
      FROM products
      GROUP BY productcategory
    ),
    countwh as (
      SELECT warehouse, count(*) as sumprice
      FROM products
      GROUP BY warehouse
    ) 

  --now use them like tables
  SELECT *
  FROM

    products p
    INNER JOIN sumcat s ON p.productcategory = s.productcategory
    INNER JOIN countwh c ON p.warehouse = c.warehouse

这是一种方法,我们可以得到每一个产品的细节,但也是所有的价格在类别和计数的所有产品在不同的仓库-也许没有意义的数据,但我演示了如何使用子查询生成数据块,可以连接到表,而且每个细节行也可以有一个摘要方面。通常情况下,生成摘要时必须忽略细节,因此这里的学习理念是:
子查询是数据块,就像表一样,可以像表一样连接
给每样东西一个别名并使用它
要同时获取详细信息和摘要,请生成摘要并将其连接到详细信息
一个表可以在查询中多次出现,甚至可以连接到它自己,只要表的两个引用具有不同的别名

相关问题