AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 31561
Accepted
W.Jackson
W.Jackson
Asked: 2013-01-08 09:06:35 +0800 CST2013-01-08 09:06:35 +0800 CST 2013-01-08 09:06:35 +0800 CST

Finalidade T-SQL do MAX neste grupo por consulta

  • 772

Encontrei alguns SQL pré-existentes que estou tendo dificuldade em entender.

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

Symbol, Ticker, Name, CategoryCode5, Assest Class, Industry e CategoryCode1 são todos campos varchar. Os campos restantes são decimais.

Meu melhor palpite é que, de alguma forma, max está sendo usado para evitar várias colunas de agrupamento, mas como isso pode retornar os resultados corretos?

Diagrama Relacional de Tabelas

t-sql group-by
  • 2 2 respostas
  • 1714 Views

2 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2013-01-08T11:43:54+08:002013-01-08T11:43:54+08:00

    Você diz: "Meu melhor palpite é que, de alguma forma, o máximo está sendo usado para evitar várias colunas de agrupamento"

    Está correto.

    e então: "... mas como isso pode retornar os resultados corretos?"

    Ele retorna resultados corretos porque Symbolé a chave primária nas tabelas Investmentse nas . PricePortanto, qualquer função agregada sobre a P.columnou an I.columnestá agregando valores idênticos. E MAX(c)quando cé 2, 2, 2 or 2é claro 2.

    A consulta poderia ser escrita de outra forma, possivelmente sem todas essas agregações? Sim, veja uma pergunta relacionada: Por que os curingas nas instruções GROUP BY não funcionam?

    Teria que ser uma GROUP BYcláusula bastante longa ou ter as agregações movidas para uma subconsulta apenas com a Holdings_Securetabela (onde Symbolnão está a chave primária) e depois unidas às outras duas:

    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', '') ;
    
    • 8
  2. JM Hicks
    2013-01-08T09:55:58+08:002013-01-08T09:55:58+08:00

    Pode ser que as agregações se encaixem melhor em uma subconsulta e façam mais sentido quando é essa subconsulta que posteriormente é unida à outra tabela INVESTMENTS e PRICE - veja abaixo.

    Nesse caso, você poderia dizer que a "razão" para isso poderia ser:

    • inexperiência do desenvolvedor c/ SQL
    • experiência do desenvolvedor adquirida na plataforma SQL que não oferece suporte a subconsultas de tabela
    • estilo de desenvolvedor

    Pode ser que alguns dados nas tabelas não estejam normalizados corretamente, ou algo semelhante ao sugerido em outros comentários, ou pode estar simplesmente errado.

    Aqui está um palpite de como talvez ele possa ser reescrito de forma mais organizada com uma subconsulta, seguida por outra consulta que pode ajudar a analisar os dados em busca de anomalias, se isso for necessário.

    reescrita possível :

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

    Você pode usar algo feio como isso para ver quais valores de I.Symbol - se houver algum - retornam mais de um valor distinto entre as colunas que são agregadas usando MAX e para ver precisamente quais são esses valores individuais.

    SELECT
        I.Symbol Symbol
    ,   I.Ticker CUSIP
    ,   I.Name Name
    ,   H.Quantity TotalQuantity
    ,   H.MarketValue TotalMarketValue
    ,   H.PriceLC Price
    ,   I.CategoryCode5 BUY_SELL
    ,   I.EquivFactor1 PriceTgt
    ,   P.LastPrice CurrPrice
    ,   I.AssetClass Target
    ,   I.Industry Industry
    ,   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
        AND EXISTS (
            SELECT I.Symbol
            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
            HAVING (
                COUNT(DISTINCT I.Ticker)
                + COUNT(DISTINCT I.Name)
                + COUNT(DISTINCT H.PriceLC)
                + COUNT(DISTINCT I.CategoryCode5)
                + COUNT(DISTINCT I.EquivFactor1)
                + COUNT(DISTINCT P.LastPrice)
                + COUNT(DISTINCT I.AssetClass)
                + COUNT(DISTINCT I.Industry)
                + COUNT(DISTINCT I.CategoryCode1)
            )
            > 0
        );
    
    • 4

relate perguntas

  • Como alterar as configurações do gerenciador de configuração do servidor SQL usando o TSQL?

  • Como posso obter uma lista de nomes e tipos de coluna de um conjunto de resultados?

  • MS SQL: Use o valor calculado para calcular outros valores

  • Como posso saber se um banco de dados SQL Server ainda está sendo usado?

  • Implementando uma consulta PIVOT

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve