没有分组的总和和重复值的最大数量

时间:2016-02-19 21:26:30

标签: sql sql-server sql-server-2008

我有一张类似这样的表

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不应该卷起来,只显示具有最大重复数的数字。但它应该汇总美元领域。

谢谢,

2 个答案:

答案 0 :(得分:1)

有点复杂,可能会简化,但您可以通过获取COUNT的{​​{1}},然后通过Stdhrs对其进行排名,然后拉出{{}来实现此目的。 1}}来自它的Stdhrs,它具有最高DENSE_RANK()(例如:MAX())。

COUNT

SQL Fiddle Live Demo

答案 1 :(得分:1)

拿了两个CTE,但这是我头脑中的第一件事。

;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