代码之家  ›  专栏  ›  技术社区  ›  sriehl

在SQL Server数据库中选择最大值为的行(从组中)

  •  1
  • sriehl  · 技术社区  · 14 年前

    我有一个大数据库,正在整理一份数据报告。我对许多表中的数据进行了汇总,得到了两个如下所示的表。

    id | code | value          id | code | value
    13 |  AA  | 0.5            13 |  AC  | 2.0
    13 |  AB  | 1.0            14 |  AB  | 1.5
    14 |  AA  | 2.0            13 |  AA  | 0.5
    15 |  AB  | 0.5            15 |  AB  | 3.0
    15 |  AD  | 1.5            15 |  AA  | 1.0
    

    我需要一个ID列表,其中代码(从两个表中汇总)的值最大。

    13 |  AC
    14 |  AA
    15 |  AB
    

    有4000到6000条记录,无法更改原始表。我不太担心性能,因为我一年只需要运行几次。

    编辑: 让我看看我是否能更清楚地解释一下,假设ID是客户ID,代码是他们从谁订购的,值是他们在那里花了多少钱。

    我需要一个客户ID和客户花费最多的商店的列表(如果他们在两个不同的商店花费相同,请在商店名称中输入一个值,如“zz”)。

    2 回复  |  直到 14 年前
        1
  •  2
  •   KM.    14 年前

    试试这个:

    DECLARE @Table1 table (id int, code char(2), value decimal(5,1))
    INSERT @Table1 VALUES (13 ,  'AA'  , 0.5)
    INSERT @Table1 VALUES (13 ,  'AB'  , 1.0)
    INSERT @Table1 VALUES (14 ,  'AA'  , 2.0)
    INSERT @Table1 VALUES (15 ,  'AB'  , 0.5)
    INSERT @Table1 VALUES (15 ,  'AD'  , 1.5)
    
    DECLARE @Table2 table (id int, code char(2), value decimal(5,1))
    INSERT @Table2 VALUES (13 ,  'AC'  , 2.0)
    INSERT @Table2 VALUES (14 ,  'AB'  , 1.5)
    INSERT @Table2 VALUES (13 ,  'AA'  , 0.5)
    INSERT @Table2 VALUES (15 ,  'AB'  , 3.0)
    INSERT @Table2 VALUES (15 ,  'AA'  , 1.0)
    
    SELECT
         dt.id, MAX(dt.code) AS code, sum(dt.value) as value
        from (select id, code, value
                  from @Table1
                  UNION ALL
                  select
                      id, code, value
                      from @Table2
             ) dt
            group by dt.id
            order by id
    

    输出:

    id          code value
    ----------- ---- ---------------------------------------
    13          AC   4.0
    14          AB   3.5
    15          AD   6.0
    
    (3 row(s) affected)
    

    我不知道你在找什么?这是每个ID的最大代码和值。如果这不是你想要的,请详细说明问题。

    编辑 编辑完op后,使用与上面代码相同的表:

    ;WITH AllTAbles AS
    (select 
         id, code, value
         from @Table1
     UNION ALL
     select
         id, code, value
         from @Table2
    )
    , MaxValues AS
    (SELECT
         dt.id, MAX(dt.value) as MaxValue, SUM(dt.value) AS SumValue
         from AllTAbles dt
         group by dt.id
    )
    , StoreCount AS
    (SELECT
         a.id,a.Code, COUNT(*) AS StoreCount
         FROM AllTAbles            a
             INNER JOIN MaxValues  m ON a.id=m.id AND a.value=m.MaxValue
         GROUP BY a.id,a.Code
    )
    SELECT
        s.id
            ,CASE
                 WHEN s.StoreCount=1 THEN s.Code
                 ELSE 'ZZ'
             END AS code
            ,m.SumValue
        FROM StoreCount           s
            INNER JOIN MaxValues  m ON s.id=m.id
        ORDER BY s.id
    

    输出:

    id          code SumValue
    ----------- ---- ----------
    13          AC   4.0
    14          AA   3.5
    15          AB   6.0
    
    (3 row(s) affected)
    

    op没有说明SQL Server的版本,因此这里有一个不使用CTES的SQL Server 2005之前的版本,其输出与上面的CTE版本相同:

    SELECT
        s.id
            ,CASE
                 WHEN s.StoreCount=1 THEN s.Code
                 ELSE 'ZZ'
             END AS code
            ,s.SumValue
        FROM (SELECT           
                  a.id,a.Code, COUNT(*) AS StoreCount, m.SumValue
                  FROM (select 
                            id, code, value
                            from @Table1
                        UNION ALL
                        select
                            id, code, value
                            from @Table2
                       ) a
                      INNER JOIN (SELECT
                                      dt.id, MAX(dt.value) as MaxValue, SUM(dt.value) AS SumValue
                                      from (select 
                                                id, code, value
                                                from @Table1
                                            UNION ALL
                                            select
                                                id, code, value
                                                from @Table2
                                           ) dt
                                      group by dt.id
                                 ) m ON a.id=m.id AND a.value=m.MaxValue
                  GROUP BY a.id,a.Code,m.SumValue
             ) s
        ORDER BY s.id
    
        2
  •  1
  •   BlackICE    14 年前
    select id, code, sum(value) as value
    from 
    (
    select id, code, value
    from yyy
    UNION
    select id, code, value
    from zzz
    ) aaa
    group by id, code
    order by sum(value)
    

    或者从分组中删除ID:

    select code, sum(value) as value
    from 
    (
    select id, code, value
    from yyy
    UNION
    select id, code, value
    from zzz
    ) aaa
    group by code
    order by sum(value)