Разница в этих запросах - PullRequest
       29

Разница в этих запросах

0 голосов
/ 27 ноября 2009

Я выполняю запрос другим способом в MSSQL, но второй запрос не дает результата в качестве первого.

Query 1:
    select dbresultsid, TestCase, BuildID, Analyzed,
         Verdict, 
         (select count(Verdict) from results where BuildID = 'Beta1' 
                 and Verdict = 'PASS') AS PASS, 
         (select count(Verdict) from results where BuildID = 'Beta1' 
                 and Verdict = 'FAIL') AS FAIL, 
         (select count(Verdict) from results where BuildID = 'Beta1' 
                 and Verdict = 'INCONC') AS INCONC, 
         (select count(Verdict) from results where BuildID = 'Beta1' 
                 and Verdict = 'TIMEOUT') AS TIMEOUT 
    from results 
    where BuildID = 'Beta1'       
    group by TestCase,dbresultsid 
    order by Analyzed

Query 2:

select dbresultsid, TestCase, BuildID, Analyzed,
         Verdict, 
(case when Verdict='PASS' then count(Verdict) else 0 end) as PASS,
(case when Verdict='FAIL' then count(Verdict) else 0 end) as FAIL,
(case when Verdict='INCONC' then count(Verdict) else 0 end) as INCONC,
(case when Verdict='TIMEOUT' then count(Verdict) else 0 end) as TIMEOUT
from results
where 
BuildID = 'Beta1'
group by TestCase,dbresultsid 
order by Analyzed


Results :
for Query 1:
if the total number of PASS = 20,
 then PASS column will display 20 everywhere.

Results :
for Query 2:
here whereever there is PASS, it displays 1 and the total 20 rows where pass is displayed there is 1, 

Я хочу, чтобы результаты запроса 2 совпадали с запросом 1

есть идеи, пожалуйста?

спасибо,

Ответы [ 3 ]

0 голосов
/ 27 ноября 2009

Почему бы вам просто не использовать первый? На мой взгляд, это хороший способ получить ваши результаты, если ключи для справки и группировки по ним четко определены. Я только изменю «где» в подвыборах, чтобы не повторять каждый раз клавишу, вместо этого сделав прямую ссылку на основную таблицу.

(select count .. from results where BuildID = r1.BuildID and Verdict  ..)
from results r1
0 голосов
/ 27 ноября 2009

Прежде всего, поскольку вы упоминаете в комментарии, что dbresultsid является ключевым столбцом, Включение его в предложение group by неэффективно, вы получите одну выходную строку для каждой строки в исходной таблице (которая соответствует предложению where).

Во-вторых, поскольку подзапросы в первом запросе некоррелированные , их вывод не зависит от строки из внешнего запроса. Поэтому они будут выполняться только один раз, и сгенерированное то же самое значение будет повторяться в каждой строке вывода.

Итак, если результат первого запроса действительно тот, который вам нужен (где в исходной строке «Beta1» есть одна строка в таблице результатов, а каждая строка в выходных данных имеет те же значения в последних 4 столбцах), есть довольно близко к лучшему, что вы можете сделать. Просто уберите группу по предложению - она ​​вам не нужна.

Select 
  dbresultsid, TestCase, BuildID, Analyzed, Verdict,  
  z.PASS, z.FAIL, z.INCONC, z.TIMEOUT
From results r Cross Join 
  (Select 
     Sum(case when Verdict='PASS' then 1 else 0 end) PASS,
     Sum(case when Verdict='FAIL' then 1 else 0 end) FAIL,
     Sum(case when Verdict='INCONC' then 1 else 0 end) INCONC,
     Sum(case when Verdict='TIMEOUT' then 1 else 0 end) TIMEOUT
   From results Where BuildID = 'Beta1') Z
Where BuildID = 'Beta1'
Order By Analyzed
0 голосов
/ 27 ноября 2009

Первый запрос выполняет SELECT с WHERE, чтобы вернуть только строки, которые имеют соответствующий вердикт, а затем подсчитывает эти строки. Второй запрос подсчитывает все строки каждый раз.

Вы можете попробовать:

select 
  dbresultsid, TestCase, BuildID, Analyzed, Verdict, 
  Sum(case when Verdict='PASS' then 1 else 0 end) as PASS,
  Sum(case when Verdict='FAIL' then 1 else 0 end) as FAIL,
  Sum(case when Verdict='INCONC' then 1 else 0 end) as INCONC,
  Sum(case when Verdict='TIMEOUT' then 1 else 0 end) as TIMEOUT
from 
  results
where 
  BuildID = 'Beta1'
group by 
  TestCase, dbresultsid 
order by 
  Analyzed

Данные испытаний:

  CREATE TABLE #Test (BuildID Integer, Verdict char(7))
  INSERT INTO #TEST (Buildid, Verdict)
    VALUES (1, 'PASS')
  INSERT INTO #TEST (Buildid, Verdict)
    VALUES (1, 'PASS')
  INSERT INTO #TEST (BuildID, Verdict)
    VALUES (2, 'FAIL')
  INSERT INTO #TEST (BuildID, Verdict)
    VALUES (3, 'INCONC')
  INSERT INTO #TEST (BuildID, Verdict)
    VALUES(4, 'TIMEOUT')

Запрос:

select buildid,
  sum(case verdict when 'PASS' then 1 else 0 end) as Pass,
  sum(case verdict when 'FAIL' then 1 else 0 end) as Fail,
  sum(case verdict when 'INCONC' then 1 else 0 end) as Inconc,
  sum(case verdict when 'TIMEOUT' then 1 else 0 end) as TimeOut
FROM #temp
group by buildid

Выход:

Item    buildid PASS    Fail    Inconc  TimeOut 
1         1      2       0        0        0
2         2      0       1        0        0
3         3      0       0        1        0
4         4      0       0        0        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...