2012-04-19 104 views
7

的最大的總和我有一個這樣的表在報表設計: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 2012-04-19 14:35:38

+0

我正在使用2008 – richsoni 2012-04-19 16:09:37

回答

9

也許是這樣的:

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

你也可以像下面這樣做。如果您正在使用SQL Server 2005+:

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 

編輯

如果你有1000級的類別。那麼動態數據透視將是最好的解決方案。所以像這樣:

測試數據

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 2012-04-19 15:28:41

+0

@paabobo:如果有1000類別仍然會做一個關鍵。但在這種情況下,一個動態的樞紐。如果這是最好的解決方案。這完全取決於數據庫模式。但有利的一面是,你只需要分組。這必須要快得多。我認爲在這種情況下,一個關鍵點可能對錶現有積極影響。 – Arion 2012-04-19 22:01:24

+0

@rsoni:記得點贊你認爲很好的答案。這給了我們一種溫暖的模糊感覺:P – Arion 2012-04-19 22:07:35

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 
0

下返回一個值:

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

你可以使用它作爲一個子查詢計算Total列的值。

另外,TOP (1)可以用來代替的DISTINCT(不知道爲什麼我以前無法想象的吧):

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