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 / 341511
Accepted
Łukasz Góra
Łukasz Góra
Asked: 2024-08-08 18:00:57 +0800 CST2024-08-08 18:00:57 +0800 CST 2024-08-08 18:00:57 +0800 CST

Como obter registros que atendam às condições armazenadas em outras tabelas

  • 772

Problema: Como obter requisitos aprovados onde existem 4 tabelas em tal relação requisitos-> links <-test_cases test_cases-> resultados <-resultado

Cenário:

Tabela1 - requisitos

id_requerido status
req-1 abrir
req-2 abrir

Tabela2 - casos_teste

id_teste status
tc-1 abrir
tc-2 cancelado

Tabela3 - links

link_id id_requerido id_teste
link-1 req-1 tc-1
link-2 req-1 tc-2

Tabela4 - resultados dos testes

id_resultado id_teste resultado
res-1 tc-1 passou
res-2 tc-2 fracassado

Até agora tentei essa abordagem para gerar uma tabela req_id | cnt_test_cases | cnt_results e tratar o requisito como aprovado quando cnt_test_cases = cnt_results(='passed') mas não funciona porque essas colunas calculadas não existem para a instrução 'Having' no final

SELECIONE requisitos DISTINTOS.req_id,

(SELECT COUNT (DISTINCT test_cases.test_id) FROM test_cases, links WHERE links.req_id = requisitos.req_id AND links.test_id = test_cases.test_id AND test_cases.status! = 'cancelled') como cnt_test_cases,

(SELECT COUNT (DISTINCT results.result) FROM results, links WHERE links.req_id = requisitos.req_id AND links.test_id = results.test_id AND results.reuslt = 'passed') como cnt_test_cases) como cnt_results

Tendo cnt_test_cases = cnt_results

Talvez haja uma abordagem melhor?

count
  • 2 2 respostas
  • 36 Views

2 respostas

  • Voted
  1. Best Answer
    Yano_of_Queenscastle
    2024-08-08T22:18:46+08:002024-08-08T22:18:46+08:00

    Uma solução seria agrupar o SELECT que você já possui em outro SELECT e então filtrar as diferenças na seleção externa usando a cláusula WHERE.

    Algo assim:

    SELECT *
    FROM 
      (
        SELECT
          requirements.req_id,
          (
            SELECT 
              COUNT (DISTINCT test_cases.test_id) 
            FROM test_cases, links 
            WHERE links.req_id = requirements.req_id 
                AND links.test_id = test_cases.test_id 
                AND test_cases.status != 'cancelled'
          ) as cnt_test_cases,
          (
            SELECT 
              /*
              This seems wrong. You likely don't want to 
              squash different 'passed' results into single number?
              */
              COUNT (DISTINCT results.result) 
            FROM results, links 
            WHERE links.req_id = requirements.req_id 
                AND links.test_id = results.test_id 
                AND results.result = 'passed'
          ) as cnt_results
         FROM dbo.requirements
      ) x
    WHERE cnt_test_cases = cnt_results
      /* you might want to put in here something like 
        AND cnt_results > 0
      to make sure there are are at least some passed requirements
      */
    

    Violino

    • 1
  2. FevziKartal
    2024-08-08T22:24:58+08:002024-08-08T22:24:58+08:00

    Ao executar a seguinte consulta, podemos encontrar a matriz do seu conjunto de registros

    select r.[req_id], r.[status] req_status,
    l.[link_id], l.[req_id] link_req_id, l.[test_id] link_test_id,
    t.[test_id], t.[status] test_status,
    s.[result_id], s.[test_id] result_test_id, s.[result] from [dbo].[requirements] r
    left join [dbo].[links] l on r.req_id=l.req_id
    left join [dbo].[test_cases] t on l.test_id=t.test_id
    left join [dbo].[results] s on t.test_id=s.test_id
    

    como mostrado na imagem

    insira a descrição da imagem aqui

    Acho que você está tentando descobrir quantos testes cancelados e aprovados dependem do requisito. A consulta teve alguns erros, eu os comento.

    SELECT DISTINCT requirements.req_id,
        
    (SELECT COUNT (DISTINCT test_cases.test_id) 
    FROM test_cases, links 
    WHERE links.req_id = requirements.req_id AND 
    links.test_id = test_cases.test_id AND 
    test_cases.status != 'cancelled') as cnt_cancelled_test_cases,
    --cnt_test_cases,
        
    (SELECT COUNT (DISTINCT results.result) 
    FROM results, links 
    WHERE links.req_id = requirements.req_id AND 
    links.test_id = results.test_id AND 
    results.result = 'passed') as cnt_passed_test_cases
     --) as cnt_results
        
    FROM requirements
    --Having cnt_test_cases = cnt_results
    

    O resultado é o seguinte

    insira a descrição da imagem aqui

    • 0

relate perguntas

  • Contando resultados para junção cruzada

  • Select Count(*) FROM with-clause-named table order by a, b not work

  • Necessidade de contar registros e contagem de grupos por data no Oracle

  • como obter count(*) da tabela que possui coluna ou não?

  • SELECT COUNT GROUP BY é mais eficiente do que contar um conjunto de resultados?

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