2017-02-20 20 views
1

Как получить значение MAX для диапазона SUM, который у меня есть?SQL Server SUM then MAX

Выходной ток:

Size | Format | ColB | Value 
Large | PCT | Tmp1 | 23.05 
Large | PCT | Tmp3 | 109.00 
Large | PCT | Tmp50 | 3.22 
Large | PCT | Tmp109 | 987.23 
Large | PCT | Tmp58 | 455.30 

Ожидаемый результат:

Size | Format | ColB | Value | Max_Value 
Large | PCT | Tmp1 | 23.05 | 987.23 
Large | PCT | Tmp3 | 109.00 | 987.23 
Large | PCT | Tmp50 | 3.22 | 987.23 
Large | PCT | Tmp109 | 987.23 | 987.23 
Large | PCT | Tmp58 | 455.30 | 987.23 

Позвольте мне знать, если это возможно.
Текущий код ниже:

USE DB1 

DECLARE @StartDate DATE 
DECLARE @EndDate DATE 
DECLARE @ColA VARCHAR(10) 
DECLARE @ColB VARCHAR(20) 
DECLARE @ColC VARCHAR(15) 
DECLARE @ColD VARCHAR(15) 
DECLARE @ColE VARCHAR(15) 
DECLARE @ColF VARCHAR(15) 
DECLARE @ColG VARCHAR(15) 

BEGIN 
SET @StartDate = '01/01/2017' 
SET @EndDate = '01/14/2017' 
SET @ColA = '%%' 
SET @ColB = '%%' 
SET @ColC = '%%' 
SET @ColD = '%%' 
SET @ColE = '%%' 
SET @ColF = '%%' 
SET @ColG = '%%' 
END 

SELECT 
    'Large' AS [Size] 
    ,'PCT' AS [Format] 
    ,[ColB] 
    ,CAST((SUM([Numerator])/SUM([Denominator]))*100 AS NUMERIC(12,2)) AS [Value] 
FROM [Table1] WITH(NOLOCK) 
WHERE [Date] BETWEEN @StartDate AND @EndDate 
AND [ColA] LIKE @ColA 
AND [ColB] LIKE @ColB 
AND [ColC] LIKE @ColC 
AND [ColD] LIKE @ColD 
AND [ColE] LIKE @ColE 
AND [ColF] LIKE @ColF 
AND [ColG] LIKE @ColG 
GROUP BY [ColB] 

Спасибо заранее.

+0

Добавить некорректный подзапрос в список выбора. – jarlh

ответ

0

Вы можете использовать функцию окна, как это:

SELECT 
    'Large' AS [Size] 
    ,'PCT' AS [Format] 
    ,[ColB] 
    ,CAST((SUM([Numerator])/SUM([Denominator]))*100 AS NUMERIC(12,2)) AS [Value] 
    ,cast(max(sum([Numerator])/sum([Denominator])) over(partition by null)) as numeric(12,2)) *100 as [MaxValue] 
FROM [Table1] WITH(NOLOCK) 
WHERE [Date] BETWEEN @StartDate AND @EndDate 
AND [ColA] LIKE @ColA 
AND [ColB] LIKE @ColB 
AND [ColC] LIKE @ColC 
AND [ColD] LIKE @ColD 
AND [ColE] LIKE @ColE 
AND [ColF] LIKE @ColF 
AND [ColG] LIKE @ColG 
GROUP BY [ColB] 

Я думаю, что он должен работать в вашем случае.

+0

Работает так, как ожидалось. Спасибо. Дополнительный вопрос: как я могу создать новый столбец для возврата «Да», если значение [Value] для этой строки соответствует [MaxValue]? Это просто для облегчения видимости, если это невозможно, это нормально. Еще раз спасибо за вашу помощь. – black31cat

+0

Вы можете завершить этот запрос во внешнем запросе и выполнить проверку там: 'select a. *, Iif (a.Value = a.MaxValue, 'YES', 'NO') как IfMatches from (SELECT ' Large 'AS [Размер] ,' PCT 'AS [Формат] , [ColB] ... ... GROUP BY [ColB]) как ' – plamenbv

1

Используйте запрос Sub вашего SUM, а затем воспользуйтесь функцией MAX, чтобы получить это.

SELECT 'Large' AS [Size], 'PCT' AS [Format], [ColB], 
CAST((SUM([Numerator])/SUM([Denominator]))*100 AS NUMERIC(12,2)) AS [Value], 
    (SELECT MAX(SUBValue) 
    FROM (SELECT [ColB], CAST((SUM([Numerator])/SUM([Denominator]))*100 AS NUMERIC(12,2)) AS [SUBValue] 
     FROM [Table1] WITH(NOLOCK) 
     WHERE [Date] BETWEEN @StartDate AND @EndDate 
     AND [ColA] LIKE @ColA 
     AND [ColB] LIKE @ColB 
     AND [ColC] LIKE @ColC 
     AND [ColD] LIKE @ColD 
     AND [ColE] LIKE @ColE 
     AND [ColF] LIKE @ColF 
     AND [ColG] LIKE @ColG 
     GROUP BY [ColB])) AS Max_Value 
FROM [Table1] WITH(NOLOCK) 
WHERE [Date] BETWEEN @StartDate AND @EndDate 
AND [ColA] LIKE @ColA 
AND [ColB] LIKE @ColB 
AND [ColC] LIKE @ColC 
AND [ColD] LIKE @ColD 
AND [ColE] LIKE @ColE 
AND [ColF] LIKE @ColF 
AND [ColG] LIKE @ColG 
GROUP BY [ColB]