2012-04-19 4 views
7

ait Max toplamı ben rapor tasarımcısı böyle bir tablo var Maks (miktar)) ve bu hücre için toplama toplamı devre dışı bırakıldı.SQL Server 2008 Raporlama:</p> <pre><code>Category: 1 2 3 4 Total Max Amount: x y z c ? </code></pre> <p>Max Tutarı toplam almak gerekir, ancak ifadeleri (me Sum almasına izin vermez: grup

Maksimum miktar satırı, her bir kategorinin maksimumunu alan bir ifadedir. Kaynak veri tekrarlanan değerlere sahip, bu yüzden maks. Örneğin: Tabloda

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

diğer sütunlar farklıdır, fakat miktar aynı olacaktır böylece farklı değerleri seçebilir sadece. Böyle

+0

kullandığınız hangi sql sürümü? – Arion

+0

Ben 2008 – richsoni

cevap

9

Belki bir şey:

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

Böyle bunu da yapabilirsiniz. Eğer sql server 2005+ kullanıyorsanız:

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 

DÜZENLEME

Eğer 1000 kategori var. Daha sonra dinamik bir pivot en iyi çözüm olacaktır. Böyle Yani:

Test verileri

CREATE TABLE #T 
    (
     Category INT, 
     Amout FLOAT 
    ) 

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

Benzersiz sütun adları

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 

Dinamik mil

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

kullanıyorum 1000 kategoriler varsa ne olur? Bu sadece en iyi çözüm olup olmadığını merak ediyorum – dansasu11

+0

@paabobo: 1000 kategori varsa hala bir pivot yapar. Ama bu durumda dinamik bir eksen. En iyi çözüm ise ya da değil. Her şey veritabanı şemasına bağlı. Ama artı tarafta ise sadece sizler tarafından gruplanmak zorundasınız. Bu performans mengene çok daha hızlı olmalı. Bence bu durumda bir pivot performans için pozitif olabilir. – Arion

+0

@rsoni: İyi olduğunu düşündüğünüz cevabı belirtmeyi unutmayın. Bu bize sıcak ve bulanık bir his veriyor: 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 
0

aşağıdaki sonuçların, bir kere değeri:

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

için Total sütunun değerinin hesaplanması bir alt sorgu olarak kullanabilir.

Alternatif TOP (1) (bunu daha önce düşünemedim neden bilmiyorum) DISTINCT yerine kullanılabilir:

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