2012-04-19 20 views
7

の最大の合計Iは、レポートデザイナで、このようなテーブルを持っている:SQL Server 2008のレポート:グループ

Category:  1  2  3  4 Total 
Max Amount:  x  y  z  c  ? 

私はマックス金額の合計を取得する必要がありますが、表情は私が(合計を取らせません。最大(金額))、このセルの加算合計は無効になります。

最大量の行は、各カテゴリの最大値をとる式です。ソースデータには繰り返し値があるので、最大値をとるだけです。たとえば、

Category Amount 
    1   4.6 
    1   4.6 
    1   4.6 
    2   5 
    3   4 

表内の他の列は異なるものの、量は同じであるため、別個の値を選択することはできません。たぶん

+0

使用しているどのようなSQLのバージョン? – Arion

+0

私は2008年を使用しています – richsoni

答えて

9

このような何か:

SELECT 
    SUM(t1.maxAmout) 
FROM 
(
    SELECT 
     MAX(t.Amout) AS maxAmout, 
     t.Category 
    FROM 
     yourTable AS t 
    GROUP BY 
     t.Category 
) AS t1 

あなたはこのようにそれをも行うことができます。あなたが1000年のカテゴリーをお持ちの場合は

SELECT 
    pvt.[1], 
    pvt.[2], 
    pvt.[3], 
    (
     pvt.[1]+ 
     pvt.[2]+ 
     pvt.[3] 
    ) AS Total 
FROM 
(
    SELECT 
     t.Category, 
     t.Amout 
    FROM 
     yourTable AS t 
) AS SourceTable 
PIVOT 
(
    MAX(Amout) 
    FOR Category IN([1],[2],[3]) 
) AS pvt 

EDIT

:あなたは、SQL Serverの2005+を使用している場合。次に、動的ピボットが最適なソリューションになります。

テストデータ

CREATE TABLE #T 
    (
     Category INT, 
     Amout FLOAT 
    ) 

INSERT INTO #T 
VALUES 
    (1,4.6), 
    (1,4.6), 
    (1,4.6), 
    (2,5), 
    (3,4) 

ユニークな列名

DECLARE @cols VARCHAR(MAX) 
DECLARE @colsTotal VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY t.Category ORDER BY t.Amout) AS RowNbr, 
     t.* 
    FROM 
     #T AS t 
) 
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(Category), 
        QUOTENAME(Category)), 
     @colsTotal=COALESCE(@colsTotal + '+ISNULL('+QUOTENAME(Category)+',0)', 
        'ISNULL('+QUOTENAME(Category)+',0)') 
FROM 
    CTE 
WHERE 
    CTE.RowNbr=1 
ORDER BY 
    Category 

ダイナミックピボット

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    '[email protected]+', 
    (
     '[email protected]+' 
    ) AS Total 
FROM 
(
    SELECT 
     t.Category, 
     t.Amout 
    FROM 
     #T AS t 
) AS SourceTable 
PIVOT 
(
    MAX(Amout) 
    FOR Category IN('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 
+0

1000のカテゴリがあればどうなりますか?これが最善の解決策であるかどうか不思議です。 – dansasu11

+0

@paabobo:1000のカテゴリがある場合、ピボットを実行します。しかし、その場合は動的ピボット。それが最良の解決策であるかどうか。すべてがデータベーススキーマに依存します。しかしプラスの面では、グループ化するだけです。それはパフォーマンスがより速くなければなりません。私はこの場合、ピボットはパフォーマンスにとってプラスになると思います。 – Arion

+0

@ルソニ:あなたが良いと思う答えをupvoteすることを忘れないでください。それで私たちは皆暖かくぼんやり感を覚えています。P – Arion

2
WITH 
    aggregate 
AS 
(
    SELECT 
    category, 
    MAX(amount) AS max_amount 
    FROM 
    yourTable 
    GROUP BY 
    category 
) 
SELECT 
    MAX(CASE WHEN category = 1 THEN max_amount ELSE NULL END) AS [1], 
    MAX(CASE WHEN category = 2 THEN max_amount ELSE NULL END) AS [2], 
    MAX(CASE WHEN category = 3 THEN max_amount ELSE NULL END) AS [3], 
    MAX(CASE WHEN category = 4 THEN max_amount ELSE NULL END) AS [4], 
    SUM(max_amount)            AS [total] 
FROM 
    aggregate 
0123:だから、このような
0

以下の単一の値を返します:あなたはTotal列の値を計算するサブクエリとしてこれを使用することができ

SELECT DISTINCT SUM(MAX(Amount)) OVER() 
FROM atable 
GROUP BY Category 

を。

また、TOP (1)は(私は前にそれを考えることができなかった理由を知りません)DISTINCTの代わりに使用することができます

SELECT TOP (1) SUM(MAX(Amount)) OVER() 
FROM atable 
GROUP BY Category