выбор строки (из группы) с максимальным значением в базе данных SQL Server - PullRequest
1 голос
/ 29 марта 2010

У меня большая база данных, и я собираю отчет с данными. Я агрегировал и суммировал данные из многих таблиц, чтобы получить две таблицы, которые выглядят следующим образом.

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

Мне нужно получить список идентификаторов с кодом (суммированным из обеих таблиц) с наибольшим значением.

13 |  AC
14 |  AA
15 |  AB

Есть 4-6 тысяч записей, и невозможно изменить исходные таблицы. Я не слишком беспокоюсь о производительности, так как мне нужно запускать ее только несколько раз в год.

редактирование: Дайте мне посмотреть, смогу ли я объяснить более четко, представьте, что идентификатор - это идентификатор клиента, код - это то, у кого они заказали, и значение - сколько они там потратили.

Мне нужен список всех идентификаторов покупателей и магазина, в котором покупатель потратил больше всего денег (и если они потратили одинаковые деньги в двух разных магазинах, введите в качестве названия магазина значение, например «ZZ»).

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

попробуйте это:

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)

Я не уверен, что вы после? это MAX-код для идентификатора, суммирующий значение. если это не то, что вам нужно, пожалуйста, уточните вопрос

РЕДАКТИРОВАТЬ после редактирования 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, поэтому ниже приведена версия, предшествующая SQL Server 2005, которая не использует CTE и имеет тот же вывод, что и версия 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
1 голос
/ 29 марта 2010
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)

или удаление идентификатора из группы:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...