2016-02-19 83 views
0

的最大數目我有一個表像這樣總和不進行分組和重複值

SELECT '123' AS Dept, '999' AS Sub, 1.789 'Stdhrs', 56 'Dollars' UNION ALL 
SELECT '123' AS Dept, '999' AS Sub, 1.489 'Stdhrs', 66 'Dollars' UNION ALL 
SELECT '123' AS Dept, '999' AS Sub, 1.789 'Stdhrs', 11 'Dollars' UNION ALL 
SELECT '123' AS Dept, '999' AS Sub, 1.789 'Stdhrs', 10 'Dollars' UNION ALL 

SELECT '123' AS Dept, '991' AS Sub, 2.679 'Stdhrs', 12 'Dollars' UNION ALL 
SELECT '123' AS Dept, '991' AS Sub, 2.679 'Stdhrs', 10 'Dollars' UNION ALL 
SELECT '123' AS Dept, '991' AS Sub, 2.679 'Stdhrs', 11 'Dollars' UNION ALL 
SELECT '123' AS Dept, '991' AS Sub, 2.679 'Stdhrs', 12 'Dollars' UNION ALL 
SELECT '123' AS Dept, '991' AS Sub, 2.699 'Stdhrs', 12 'Dollars' UNION ALL 

SELECT '124' AS Dept, '991' AS Sub, 1.111 'Stdhrs', 10 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.111 'Stdhrs', 13 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.112 'Stdhrs', 10 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.112 'Stdhrs', 8 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.112 'Stdhrs', 14 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.112 'Stdhrs', 16 'Dollars' UNION ALL 

SELECT '128' AS Dept, '111' AS Sub, 4.112 'Stdhrs', 10 'Dollars' UNION ALL 

SELECT '132' AS Dept, '777' AS Sub, 5.555 'Stdhrs', 11 'Dollars' UNION ALL 
SELECT '132' AS Dept, '777' AS Sub, 1.222 'Stdhrs', 10 'Dollars' 

我想看到的結果

SELECT '123' AS Dept, '999' AS Sub, 1.789 'Stdhrs', 143 'Dollars' UNION ALL 
SELECT '123' AS Dept, '991' AS Sub, 2.679 'Stdhrs', 57 'Dollars' UNION ALL 
SELECT '124' AS Dept, '991' AS Sub, 1.112 'Stdhrs', 71 'Dollars' UNION ALL 
SELECT '128' AS Dept, '111' AS Sub, 4.112 'Stdhrs', 10 'Dollars' UNION ALL 
SELECT '132' AS Dept, '777' AS Sub, 5.555 'Stdhrs', 21 'Dollars' UNION ALL 

基本上Stdhrs不應捲起,只顯示具有最大重複數的數字。但它應該彙總美元領域。

感謝,

+0

你在「Stdhrs」數量的關係中做什麼? –

+0

獲取(標準) – sqlsleepless

回答

1

花了兩個熱膨脹係數,但是這是突然出現在我的腦海的第一件事。

;WITH CTE_CountsAndTotals AS 
(
    SELECT 
     Dept, 
     Sub, 
     Stdhrs, 
     COUNT(*) OVER (PARTITION BY Dept, Sub, Stdhrs) AS cnt, 
     SUM(Dollars) OVER (PARTITION BY Dept, Sub) AS Dollars 
    FROM 
     dbo.Test 
), 
CTE_MostFrequentStdhrs AS 
(
    SELECT 
     Dept, 
     Sub, 
     Stdhrs, 
     Dollars, 
     ROW_NUMBER() OVER (PARTITION BY Dept, Sub ORDER BY cnt DESC, Stdhrs DESC) AS row_num 
    FROM 
     CTE_CountsAndTotals 
) 
SELECT 
    Dept, 
    Sub, 
    Stdhrs, 
    Dollars 
FROM 
    CTE_MostFrequentStdhrs 
WHERE 
    row_num = 1 
1

有點複雜,大概可以簡化,但你可以通過獲取StdhrsCOUNT,然後通過DENSE_RANK()排名他們,並從它拉出MAX() Stdhrs地方有這樣做最高的COUNT(例如:DENSE_RANK() = 1)。

;With Cte As 
(
    Select T.*, Dense_Rank() Over (Partition by T.Dept, T.Sub Order By X.Count Desc) Dense_Rank 
    From TestTable T 
    Join 
    (
     Select Dept, Sub, Stdhrs, Count(*) Count 
     From TestTable 
     Group By Dept, Sub, Stdhrs 
    ) X On X.Dept = T.Dept 
     And X.Sub = T.Sub 
     And X.Stdhrs = T.Stdhrs 
) 
Select C.Dept, C.Sub, X.FreqStdHrs As Stdhrs, Sum(C.Dollars) As Dollars 
From Cte C 
Cross Apply 
(
    Select Max(Stdhrs) As FreqStdHrs 
    From Cte C2 
    Where C2.Dept = C.Dept 
    And  C2.Sub = C.Sub 
    And  C2.Dense_Rank = 1 
) X 
Group By C.Dept, C.Sub, X.FreqStdHrs 

SQL Fiddle Live Demo

+0

的最大值不需要帶'OVER'子句的'DISTINCT'。這相當於一個簡單的「GROUP BY」。另外,OP需要最常見的「Stdhrs」。 'MAX'只是一個平局。 –

+0

@TomH真的,但標題中指定的OP中他們不想使用'GROUP BY' – Siyual

+0

@Siyual如果你看到部門123和子991在這種情況下stdhrs應該是2.679而不是2.699 – sqlsleepless