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 / 69618
Accepted
dotancohen
dotancohen
Asked: 2014-07-04 01:54:57 +0800 CST2014-07-04 01:54:57 +0800 CST 2014-07-04 01:54:57 +0800 CST

Consulta SELECT com subconsultas referenciadas

  • 772

Como alguém faz referência ao campo atualmente agrupado por em uma subconsulta?

Considere uma tabela com os seguintes dados:

Client    Status    Size    
   1       A         500
   1       B        1500
   2       A        2000
   2       B         800

Estou tentando obter os seguintes dados em uma única consulta:

Client     A      B
   1      500   1500
   2     2000    800

Eu tenho jogado com variações disso, sem absolutamente nenhum sucesso:

SELECT
  t.Client,
  (
    SELECT A FROM table WHERE Client=t.Client
  ) as A,
  (
    SELECT B FROM table WHERE Client=t.Client
  ) as B
FROM table t
GROUP BY t.Client;

O status de cada Cliente não é repetido , ou seja, cada cliente deve ter apenas uma linha com um determinado status. Para o propósito desta questão, podemos assumir que há exatamente uma entrada para cada status.

Observe que são cerca de cem mil linhas: cerca de 20 mil Clientes e cinco status por cliente. Existem outros campos também (como data de atualização de status e o usuário que realizou a atualização), portanto, alterar o esquema da tabela para simplesmente Client, A, Bnão é viável.

Como posso referenciar o campo agrupado nas subconsultas?

mysql select
  • 2 2 respostas
  • 105 Views

2 respostas

  • Voted
  1. Paul
    2014-07-04T02:09:08+08:002014-07-04T02:09:08+08:00

    Isso funciona, pode haver algo mais elegante:

     insert 
     select 1 as client, 'A' as [status], 500 as 'Size'
     into #temp
     insert into #temp
     select 1 as client, 'B' as [status], 1500 as 'Size'
      insert into #temp
     select 2 as client, 'A' as [status], 2000 as 'Size'
     insert into #temp
     select 2 as client, 'B' as [status], 800 as 'Size'
    
     select t.client, ta.size as 'A', tb.size as 'B'
     from #temp as t
     INNER JOIN (select client, sum(size) as size from #temp where status = 'A' group by client) as ta on t.client = ta.client
     INNER JOIN (select client, sum(size) as size from #temp where status = 'B' group by client) as tb on t.client = tb.client
     group by t.client, ta.size, tb.size
    
    • 1
  2. Best Answer
    ipodppod
    2014-07-04T02:29:14+08:002014-07-04T02:29:14+08:00

    Ai está:

    SELECT
        Client,
        SUM(IF(Status = "A", Size, 0)) AS A,
        SUM(IF(Status = "B", Size, 0)) AS B
    FROM yourtable
    GROUP BY Client
    
    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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