2012-04-19 16 views
7

के मैक्स का योग मैं रिपोर्ट डिजाइनर में इस तरह एक मेज है अधिकतम (राशि)), और इस सेल के लिए कुल योग अक्षम है।एसक्यूएल सर्वर 2008 रिपोर्टिंग:</p> <pre><code>Category: 1 2 3 4 Total Max Amount: x y z c ? </code></pre> <p>मैं मैक्स राशि की कुल प्राप्त करने की आवश्यकता है, लेकिन भाव मुझे योग ले जाने नहीं देंगे (: समूह

अधिकतम राशि पंक्ति एक अभिव्यक्ति है जो प्रत्येक श्रेणी का अधिकतम लेती है। स्रोत डेटा ने मानों को दोहराया है, इसलिए मैं अधिकतम लेता हूं। उदाहरण के लिए:

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

अन्य कॉलम तालिका में अलग हैं, लेकिन राशि एक ही होगा तो मैं न केवल अलग-अलग मान चुन सकते हैं।

+0

क्या एसक्यूएल संस्करण का उपयोग कर रहे हैं? – 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 

आप इसे इस तरह भी कर सकते हैं। आप एसक्यूएल सर्वर 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

+0

@paabobo: यदि 1000 श्रेणी है तो अभी भी एक पिवट होगा। लेकिन उस मामले में एक गतिशील पिवट। यदि यह सबसे अच्छा समाधान है या नहीं। यह सब डेटाबेस स्कीमा पर निर्भर करता है। लेकिन प्लस तरफ यह है कि आपको केवल लोगों द्वारा समूह करना होगा। यह प्रदर्शन तेजी से होना चाहिए। मुझे लगता है कि इस मामले में एक पिवट प्रदर्शन के लिए सकारात्मक हो सकता है। – Arion

+0

@rsoni: जो जवाब आपको लगता है उसे ऊपर उठाने के लिए याद रखें। यह हमें सभी को एक गर्म अस्पष्ट भावना देता है: पी – 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

निम्नलिखित रिटर्न एक भी मूल्य:

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