此 Group By Query 中 MAX 的 T-SQL 用途

W.J*_*son 6 t-sql group-by

我遇到了一些我很难理解的预先存在的 SQL。

SELECT
    MAX(I.Symbol) Symbol
,   MAX(I.Ticker) CUSIP
,   MAX(I.Name) Name
,   SUM(H.Quantity) TotalQuantity
,   SUM(H.MarketValue) TotalMarketValue
,   MAX(H.PriceLC) Price
,   MAX(I.CategoryCode5) BUY_SELL
,   MAX(I.EquivFactor1) PriceTgt
,   MAX(P.LastPrice) CurrPrice
,   MAX(I.AssetClass) Target
,   MAX(I.Industry) Industry
,   MAX(I.CategoryCode1) Risk
FROM
    HOLDINGS_SECURE H
,   INVESTMENTS I
,   PRICE P
WHERE
    H.Symbol = I.Symbol
    AND I.Product = 'stock'
    AND H.Quantity > 0
    AND I.CategoryCode5 NOT IN ('X', '')
    AND H.Symbol = P.Symbol
GROUP BY
    I.Symbol
Run Code Online (Sandbox Code Playgroud)

Symbol、Ticker、Name、CategoryCode5、Assest Class、Industry 和 CategoryCode1 都是 varchar 字段。其余字段是小数。

我最好的猜测是,以某种方式使用 max 来避免多个分组列,但这如何返回正确的结果?

表关系图

ype*_*eᵀᴹ 8

你说:“我最有根据的猜测是,以某种方式使用 max 来避免多个分组列”

那是正确的。

然后:“……但是这怎么能返回正确的结果呢?”

它返回正确的结果,因为SymbolInvestmentsPrice表中的主键。因此,aP.column或 an 上的任何聚合函数都在I.column聚合相同的值。而MAX(c)c2, 2, 2 or 2当然的2

能否以其他方式编写查询,可能没有所有这些聚合?是的,请参阅相关问题:为什么 GROUP BY 语句中的通配符不起作用?

它必须是一个相当长的GROUP BY子句,或者将聚合移动到只有Holdings_Secure表(其中Symbol不是主键)的子查询中,然后加入其他两个:

SELECT
    I.Symbol Symbol
,   I.Ticker CUSIP
,   I.Name Name

,   H.TotalQuantity
,   H.TotalMarketValue
,   H.Price

,   I.CategoryCode5 BUY_SELL
,   I.EquivFactor1 PriceTgt
,   P.LastPrice CurrPrice
,   I.AssetClass Target
,   I.Industry Industry
,   I.CategoryCode1 Risk
FROM
    ( SELECT 
          SUM(Quantity) TotalQuantity
      ,   SUM(MarketValue) TotalMarketValue
      ,   MAX(PriceLC) Price
      ,   Symbol
      FROM
          HOLDINGS_SECURE
      WHERE
          Quantity > 0
      GROUP BY
          Symbol
    ) H
  JOIN
    INVESTMENTS I
      ON H.Symbol = I.Symbol
  JOIN
    PRICE P
      ON H.Symbol = P.Symbol
WHERE
        I.Product = 'stock'
    AND I.CategoryCode5 NOT IN ('X', '') ;
Run Code Online (Sandbox Code Playgroud)