2016-04-19 9 views
0

top 50 SUM(DetailTins)レコードを返す次のクエリがあります。テーブル内のすべてのレコードに対して、SUM(DetailTins)の割合を示す別の列が必要です。SQL Serverの行の横にパーセンテージの値を取得するにはどうすればよいですか?

次のクエリで変更する必要があるのは何ですか?

また、SQL Server 2008 R2を使用しているため、Over partition by機能を使用することはできません。

WITH CTE AS 
(
    SELECT   
     ID, Name, City, State, SUM(DetailTins) AS SumTins 
    FROM    
     FeedRpts 
    WHERE 
     (RptTimeFrame BETWEEN @BeginDate AND @EndDate) 
     AND ((@VALUE = 'TN' AND STATE = 'TN') 
      OR (@VALUE = 'OOS' AND STATE <> 'TN') 
      OR (@VALUE = 'ALL')) 
    GROUP BY 
     ID, Name, City, State 
) 
SELECT TOP 50 * 
FROM CTE 
ORDER BY SumTins DESC 

答えて

1
declare @ssum int = (select SUM(DetailTins) AS SumTins from FeedRpts); 
WITH CTE 
AS 
(
SELECT ID, Name, City, State, SUM(DetailTins) AS SumTins 
FROM FeedRpts 
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) 
AND ( (@VALUE = 'TN' AND STATE = 'TN') 
     OR (@VALUE = 'OOS' AND STATE <> 'TN') 
     OR (@VALUE = 'ALL') 
    ) 
GROUP BY ID, Name, City, State 
) 
SELECT TOP (50) *, @ssum as ssum, 100.0 * SumTins/@ssum as [pct] 
FROM CTE 
ORDER BY SumTins DESC 
0

あなたのSELECT文のネストされたサブクエリを追加します。私はあなたがこれでCTEを必要とするとは思わないが、すでに書いているので、サブクエリを追加するだけです。

WITH CTE 
AS 
(
SELECT  ID, Name, City, State, SUM(DetailTins) AS SumTins 
FROM   FeedRpts 
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL')) 
GROUP BY ID, Name, City, State 
) 
SELECT TOP 50 *, (SELECT SumTins FROM CTE) AS AllRecordSumTins FROM CTE ORDER BY SumTins DESC 

あなたはサブクエリの中にいることを合計する必要があるかもしれません:あなたは、総合計を計算するために別の変数を導入することができAllRecordSumTins

2

AS(CTEからの和(SumTins)を選択)した後、割合を計算するために、この変数を使用します:

DECLARE @TotalTins INT 

SELECT @TotalTins = SUM(DetailTins) FROM FeedRpts 
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL')) 

WITH CTE 
AS 
(
SELECT  ID, Name, City, State, SUM(DetailTins) AS SumTins 
FROM   FeedRpts 
WHERE (RptTimeFrame BETWEEN @BeginDate AND @EndDate) AND ((@VALUE = 'TN' AND STATE = 'TN') OR (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL')) 
GROUP BY ID, Name, City, State 
) 
SELECT TOP 50 *, CAST(SumTins AS float)/CAST(@TotalTins AS float) AS Percentage 
FROM CTE ORDER BY SumTins DESC 
+0

良い点 - 私のANSW実際のパーセンテージ値の作成は組み込まれていませんでした。 OPはこれを分割し、分母をFLOATとしてCASTする必要があります。そうしないと、分数の代わりに0と1を大量に使用することになります。 –

+1

@ Boyd-Pあなたのコメントありがとうございます - あなたは100%正しいです。私は答えを更新しました –

0

下記のお問い合わせの私の変更を参照してください。

SELECT  
    ID, Name, City, State, 
    SUM(DetailTins) AS SumTins, 
    SUM(DetailTins)/(SELECT SUM(DetailTins) FROM FeedRpts) * 100 AS Percent_of_Total 
FROM 
    FeedRpts 
WHERE 
    (RptTimeFrame BETWEEN @BeginDate AND @EndDate) 
    AND ((@VALUE = 'TN' AND STATE = 'TN') OR 
     (@VALUE = 'OOS' AND STATE <> 'TN') OR (@VALUE = 'ALL')) 
GROUP BY 
    ID, Name, City, State 
関連する問題