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 / 64818
Accepted
user2732180
user2732180
Asked: 2014-05-09 23:42:45 +0800 CST2014-05-09 23:42:45 +0800 CST 2014-05-09 23:42:45 +0800 CST

Minha consulta falha ao segmentar os resultados conforme pretendido. O que estou fazendo errado?

  • 772

Atualização: reformulando a pergunta.

Abaixo estão os resultados e os resultados desejados. O que preciso fazer para obter os resultados desejados? Consulte http://sqlfiddle.com/#!2/d0e13c/69

obrigada

SELECT CONCAT('Greater than or equal to ',t.val2,':', count(*)) FROM
(
SELECT 
  CASE 
    WHEN val>=1000 THEN 1000
    WHEN val>=500 THEN 500
    WHEN val>=400 THEN 400
    WHEN val>=300 THEN 300
    WHEN val>=200 THEN 200
    WHEN val>=100 THEN 100 
    WHEN val>=10 THEN 10
    WHEN val>=5 THEN 5
    WHEN val>=2 THEN 2
    WHEN val>=1 THEN 1
  END AS 'val2'
FROM e
) as t
GROUP BY t.val2
ORDER BY t.val2 DESC 

Resultados:

Greater than or equal to 1000:1
Greater than or equal to 500:1
Greater than or equal to 400:2
Greater than or equal to 300:1
Greater than or equal to 200:2
Greater than or equal to 100:3
Greater than or equal to 10:1
Greater than or equal to 5:1
Greater than or equal to 1:2

Resultados desejados:

Greater than or equal to 1000:1
Greater than or equal to 500:2
Greater than or equal to 400:4
Greater than or equal to 300:5
Greater than or equal to 200:7
Greater than or equal to 100:10
Greater than or equal to 10:11
Greater than or equal to 5:12
Greater than or equal to 2:12
Greater than or equal to 1:14
mysql
  • 2 2 respostas
  • 155 Views

2 respostas

  • Voted
  1. Best Answer
    Serpiton
    2014-05-12T09:38:43+08:002014-05-12T09:38:43+08:00

    É possível converter as CASEopções em linhas de uma tabela temporária, uma JOINcom condição menor ou igual à tabela de dados obterá as linhas.

    SELECT CONCAT('Greater than or equal to ',a.val,':', count(e.val))
    FROM   (Select 1000 val UNION ALL 
            Select 500      UNION ALL
            Select 400      UNION ALL
            Select 300      UNION ALL
            Select 200      UNION ALL
            Select 100      UNION ALL
            Select 10       UNION ALL
            Select 5        UNION ALL
            Select 2        UNION ALL
            Select 1       ) a
           LEFT JOIN e ON e.val >= a.val
    GROUP BY a.val
    ORDER BY a.val  DESC
    

    Demonstração do SQLFiddle

    Outra maneira nem precisa da tabela temporária, mas obterá os resultados como colunas em vez de linhas, se você se importar com os resultados e não com o formato

    SELECT CONCAT('Greater than or equal to 1000: '
                 , SUM(Case When val >= 1000 Then 1 Else 0 End)) _1000
         , CONCAT('Greater than or equal to  500: '
                , SUM(Case When val >= 500 Then 1 Else 0 End)) _500
         , CONCAT('Greater than or equal to  400: '
                , SUM(Case When val >= 400 Then 1 Else 0 End)) _400
         , CONCAT('Greater than or equal to  300: '
                , SUM(Case When val >= 300 Then 1 Else 0 End)) _300
         , CONCAT('Greater than or equal to  200: '
                , SUM(Case When val >= 200 Then 1 Else 0 End)) _200
         , CONCAT('Greater than or equal to  100: '
                , SUM(Case When val >= 100 Then 1 Else 0 End)) _100
         , CONCAT('Greater than or equal to   10: '
                , SUM(Case When val >= 10 Then 1 Else 0 End)) _10
         , CONCAT('Greater than or equal to    5: '
                , SUM(Case When val >= 5 Then 1 Else 0 End)) _5
         , CONCAT('Greater than or equal to    2: '
                , SUM(Case When val >= 2 Then 1 Else 0 End)) _2
         , CONCAT('Greater than or equal to    1: '
                , SUM(Case When val >= 1 Then 1 Else 0 End)) _1
    FROM   e
    

    Demonstração do SQLFiddle

    • 2
  2. RolandoMySQLDBA
    2014-05-10T06:28:49+08:002014-05-10T06:28:49+08:00

    PERGUNTA PROPOSTA Nº 1

    SELECT * FROM
    (SELECT 'Count 1000' hdr,SUM(val >= 1000) GroupCount FROM e UNION
    SELECT 'Count  500',SUM(val >=  500) GroupCount FROM e UNION
    SELECT 'Count  400',SUM(val >=  400) GroupCount FROM e UNION
    SELECT 'Count  300',SUM(val >=  300) GroupCount FROM e UNION
    SELECT 'Count  200',SUM(val >=  200) GroupCount FROM e UNION
    SELECT 'Count  100',SUM(val >=  100) GroupCount FROM e UNION
    SELECT 'Count   10',SUM(val >=   10) GroupCount FROM e UNION
    SELECT 'Count    5',SUM(val >=    5) GroupCount FROM e UNION
    SELECT 'Count    2',SUM(val >=    2) GroupCount FROM e UNION
    SELECT 'Count    1',SUM(val >=    1) GroupCount FROM e) t
    ORDER BY GroupCount DESC,hdr;
    

    CARREGUE SEUS DADOS DE AMOSTRA

    mysql> USE test
    Database changed
    mysql> DROP TABLE IF EXISTS e;
    Query OK, 0 rows affected (0.14 sec)
    
    mysql> CREATE TABLE e (val INTEGER NOT NULL);
    Query OK, 0 rows affected (0.36 sec)
    
    mysql> INSERT INTO e(val) VALUES
        -> (1),(1),(5),(10),(100),(150),(199),(200),
        -> (250),(301),(401),(402),(500),(1000);
    Query OK, 14 rows affected (0.17 sec)
    Records: 14  Duplicates: 0  Warnings: 0
    
    mysql>
    

    CONSULTA PROPOSTA Nº 1 EXECUTADA

    mysql> SELECT * FROM
        -> (SELECT 'Count 1000' hdr,SUM(val >= 1000) GroupCount FROM e UNION
        -> SELECT 'Count  500',SUM(val >=  500) GroupCount FROM e UNION
        -> SELECT 'Count  400',SUM(val >=  400) GroupCount FROM e UNION
        -> SELECT 'Count  300',SUM(val >=  300) GroupCount FROM e UNION
        -> SELECT 'Count  200',SUM(val >=  200) GroupCount FROM e UNION
        -> SELECT 'Count  100',SUM(val >=  100) GroupCount FROM e UNION
        -> SELECT 'Count   10',SUM(val >=   10) GroupCount FROM e UNION
        -> SELECT 'Count    5',SUM(val >=    5) GroupCount FROM e UNION
        -> SELECT 'Count    2',SUM(val >=    2) GroupCount FROM e UNION
        -> SELECT 'Count    1',SUM(val >=    1) GroupCount FROM e) t
        -> ORDER BY GroupCount DESC,hdr;
    +------------+------------+
    | hdr        | GroupCount |
    +------------+------------+
    | Count    1 |         14 |
    | Count    2 |         12 |
    | Count    5 |         12 |
    | Count   10 |         11 |
    | Count  100 |         10 |
    | Count  200 |          7 |
    | Count  300 |          5 |
    | Count  400 |          4 |
    | Count  500 |          2 |
    | Count 1000 |          1 |
    +------------+------------+
    10 rows in set (0.01 sec)
    
    mysql>
    

    PERGUNTA PROPOSTA Nº 2

    SELECT CONCAT('Greater than or equal to ',valrange,':',GroupCount) DesiredResults FROM
    (SELECT * FROM (SELECT 1000 valrange,SUM(val >= 1000) GroupCount FROM e UNION
    SELECT 500,SUM(val >=  500) GroupCount FROM e UNION
    SELECT 400,SUM(val >=  400) GroupCount FROM e UNION
    SELECT 300,SUM(val >=  300) GroupCount FROM e UNION
    SELECT 200,SUM(val >=  200) GroupCount FROM e UNION
    SELECT 100,SUM(val >=  100) GroupCount FROM e UNION
    SELECT 10,SUM(val >=   10) GroupCount FROM e UNION
    SELECT 5,SUM(val >=    5) GroupCount FROM e UNION
    SELECT 2,SUM(val >=    2) GroupCount FROM e UNION
    SELECT 1,SUM(val >=    1) GroupCount FROM e) t) q;
    

    CONSULTA PROPOSTA Nº 2 EXECUTADA

    mysql> SELECT CONCAT('Greater than or equal to ',valrange,':',GroupCount) DesiredResult FROM
        -> (SELECT * FROM (SELECT 1000 valrange,SUM(val >= 1000) GroupCount FROM e UNION
        -> SELECT 500,SUM(val >=  500) GroupCount FROM e UNION
        -> SELECT 400,SUM(val >=  400) GroupCount FROM e UNION
        -> SELECT 300,SUM(val >=  300) GroupCount FROM e UNION
        -> SELECT 200,SUM(val >=  200) GroupCount FROM e UNION
        -> SELECT 100,SUM(val >=  100) GroupCount FROM e UNION
        -> SELECT 10,SUM(val >=   10) GroupCount FROM e UNION
        -> SELECT 5,SUM(val >=    5) GroupCount FROM e UNION
        -> SELECT 2,SUM(val >=    2) GroupCount FROM e UNION
        -> SELECT 1,SUM(val >=    1) GroupCount FROM e) t) q;
    +---------------------------------+
    | DesiredResult                   |
    +---------------------------------+
    | Greater than or equal to 1000:1 |
    | Greater than or equal to 500:2  |
    | Greater than or equal to 400:4  |
    | Greater than or equal to 300:5  |
    | Greater than or equal to 200:7  |
    | Greater than or equal to 100:10 |
    | Greater than or equal to 10:11  |
    | Greater than or equal to 5:12   |
    | Greater than or equal to 2:12   |
    | Greater than or equal to 1:14   |
    +---------------------------------+
    10 rows in set (0.00 sec)
    
    mysql>
    

    Observação: a consulta proposta nº 2 tem a saída desejada

    DE UMA CHANCE !!!

    • 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