2013-10-25 1 views
0

Я все еще новичок в SQL, и мне трудно получить максимальное значение по нескольким записям в SQL. Обычно я использую представление и присоединяюсь к представлению моей хранимой процедуры, но мне нужно иметь возможность делать это без представлений из-за динамических имен таблиц.Использование функции окна для получения максимального значения по нескольким записям - SQL

Вот мой код:

SELECT  rcl.CaseCaseId AS CaseId, cc.Label AS CaseName, rpt.RptDateCum, cp.Label, rpt.CorpProductId, corp.Label AS Scenario, proj.Label AS Project, 
         ProjectScenario.ReportDate 
into #CumTemp 
FROM   PhdRpt.ReportCaseList_542 AS rcl INNER JOIN 
         CaseScenario AS cs ON rcl.CaseCaseId = cs.CaseCaseId INNER JOIN 
         CorpScenario AS corp ON cs.CorpScenarioId = corp.CorpScenarioId INNER JOIN 
         CaseCases AS cc ON cs.CaseCaseId = cc.CaseCaseId INNER JOIN 
         PhdRpt.RptProductTech_542 AS rpt ON rcl.ReportId = rpt.ReportID AND rcl.ReportRunCaseId = rpt.RptCaseId INNER JOIN 
         CorpProduct AS cp ON rpt.CorpProductId = cp.CorpProductId INNER JOIN 
         ProjProject AS proj ON cs.ProjProjectId = proj.ProjProjectId INNER JOIN 
         ProjectScenario ON cs.ProjProjectId = ProjectScenario.ProjProjectId AND cs.CorpScenarioId = ProjectScenario.CorpScenarioId AND 
         corp.CorpScenarioId = ProjectScenario.CorpScenarioId AND proj.ProjProjectId = ProjectScenario.ProjProjectId AND 
         proj.ProjProjectId = ProjectScenario.ProjProjectId 
WHERE  (cs.CorpScenarioId = 1) AND (cs.Deleted = 0) 
ORDER BY CaseId 


Select ROW_NUMBER() OVER(order by caseid) as Row, CaseId, Scenario,Project, ReportDate, ltrim(str(sum(Gas))) as Gas, ltrim(str(SUM(Oil))) as Oil, ltrim(str(SUM(Water))) as Water 
,MAX(oil) over (partition by Project) as oilmax, MAX(gas) over (partition by Project) as gasmax, MAX(water) over (partition by Project) as watermax 
from #CumTemp 
pivot (max (RptDateCum) for Label in ([Gas], [Oil], [Water]))as x 
group by CaseId, Scenario,Project, ReportDate, Oil 
order by Row 
drop table #CumTemp 

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

Мой желаемый результат будет выглядеть примерно так.

id  oil gas water oilmax gasmax watermax 
---------------------------------------------------------- 
1  25  12  6  51  98   37 
2  36  98  19  51  98   37 
3  51  19  22  51  98   37 
4  45  77  37  51  98   37 
5  22  64  31  51  98   37 

Когда я использую свой код, он дает мне несколько строк на запись, когда мне нужна только одна строка на запись. Есть ли другой способ сделать это без использования видов или оконных функций?

+0

Вам просто нужно максимальное значение этих столбцов дерева? попробуйте что-то вроде 'select * from (yourquery), (выберите max (oil) как oilmax, max (gas), max (water) from (yourquery)), где someconditions' –

+0

Я содрогнулся, когда прочитал предложение« ... I должны иметь возможность делать это без просмотров из-за динамических имен таблиц ». – Tony

+0

@ Тони Почему? –

ответ

2

Итак, поскольку ваш запрос очень большой, я покажу, как решить вашу проблему, и вы поместите его в свой запрос. Это мой тест:

Таблица

create table testcase(
    id integer, 
    oil integer, 
    gas integer, 
    water integer 
); 

Вставки

insert into testcase values (1, 25, 12, 6); 
insert into testcase values (2, 36, 98, 19); 
insert into testcase values (3, 51, 19, 22); 
insert into testcase values (4, 45, 77, 37); 
insert into testcase values (5, 22, 64, 31); 

Sql

select * 
    from testcase as test, 
     (select max(oil) maxoil, 
       max(gas) maxgas, 
       max(water) maxwater 
      from testcase) as maxes 
order by test.id 

Это должно дать вам ваши данные, как вы хотите. Посмотрите на скрипку http://sqlfiddle.com/#!3/be2b7/3/0

+0

Делает ли вложенный запрос выбора до или после точки опоры? Я не могу заставить его работать в любом случае. Значения нефти, газа и воды все начинаются с одной колонки. –

+0

Я получаю следующее сообщение об ошибке: Msg 116, Level 16, State 1, Line 14 Только одно выражение может быть указано в списке выбора, если подзапрос не вводится с EXISTS.' –

+0

' Выберите ROW_NUMBER() OVER (order by caseid) как Row, CaseId, CaseName, ltrim (str (сумма (Газ))) в качестве газа, ltrim (str (SUM (Oil))) в качестве масла, ltrim (str (СУММА (вода))) в качестве воды , (выбрать макс (масло) maxoil, макс (газ) maxgas, макс (вода) maxwater от #CumTemp) в качестве от исчерпана #CumTemp поворота (макс (RptDateCum) для Ярлык в ([Газ], [Нефть], [Вода])) в качестве x group by CaseId, CaseName Сортировать по Строка drop table # CumTemp' –