2017-02-20 26 views
1

私が持っているSUM範囲のMAX値はどのようにして取得できますか?SQL Server SUM、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

これは期待どおりに動作します。ありがとうございました。追加の質問は、その行の[値]が[MaxValue]と一致する場合、「はい」を返すために新しい列を作成する方法はありますか?これは実現しにくい場合は見やすくするためですが、それは問題ありません。再度、あなたの助けに感謝します。 – black31cat

+0

このクエリを外側のクエリで囲み、チェックを行うことができます。 '(i.A.Value = a.MaxValue、 'YES'、 'NO')をIfMatchesとして選択します。 from(SELECT '大型 'AS [サイズ] 、' PCT 'AS [フォーマット] 、[ColB] ... ... GROUP BY [ColB] as a'' – plamenbv

1

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]