Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
CREATE TABLE #data
(
    client  int,
    account int,
    groupp  int,
    rest   money    -- остатки на счетах
)
-- в самой таблице допускается хранение здвоений
-- клиенты могут иметь несколько групп и данные по таким клиентам дублируются в таблице
INSERT INTO #data
SELECT 1, 1, 1, 10 UNION ALL 
SELECT 1, 1, 2, 10 UNION ALL 
SELECT 1, 2,  1, 50 UNION ALL 
SELECT 1, 2,  2, 50  

-- Нужно получить вывод сумм остатков на счетах 
-- с группировкой по клиенту и коэффициенту, но без задвоений в группах

-- Вот такой DISTINCT даст задвоения в суммах
SELECT DISTINCT
    client, SUM(rest)
FROM 
    #data 
GROUP BY client

-- А вот этот посчитает правильно
SELECT 
    d.client, SUM(d.rest)
FROM 
    ( SELECT DISTINCT client, rest FROM #data ) d
GROUP BY d.client

-- Но у меня такое ощущение, что я опять всё делаю криво, туплю или чего-то не знаю или не догоняю.
-- Можно ли сделать как-то получше?

DROP TABLE #data
26 янв 12, 20:41    [11979286]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
начинающий sql-гуру, что мешает всегда брать первую группу?
* Проектировщика БД надобно повесить за яйца и дергать за уши.
26 янв 12, 20:47    [11979331]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
kDnZP
начинающий sql-гуру, что мешает всегда брать первую группу?
* Проектировщика БД надобно повесить за яйца и дергать за уши.

Группы могут быть разными (не обязательно первые).
Как вариант - использование подзапроса c top 1, но это те же яйца
Насчёт проектироващика согласен.
Не первый раз уже матерюсь по этому поводу.((
26 янв 12, 21:06    [11979416]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
SELECT 
    d.client, SUM( distinct d.rest)
FROM #data d
GROUP BY d.client


а так?
26 янв 12, 21:17    [11979469]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
Knyazev Alexey
SELECT 
    d.client, SUM( distinct d.rest)
FROM #data d
GROUP BY d.client


а так?

Вау! Век живи век учись.
Спасибо!

Впервые вижу такой синтаксис.
С 2005-го появился или всегда был?
26 янв 12, 21:22    [11979490]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Knyazev Alexey
SELECT 
    d.client, SUM( distinct d.rest)
FROM #data d
GROUP BY d.client



а так?

Бред. Проверить можно:
INSERT INTO #data
SELECT 1, 1, 1, 10 UNION ALL 
SELECT 1, 1, 2, 10 UNION ALL 
SELECT 1, 2,  1, 10 UNION ALL 
SELECT 1, 2,  2, 10  
26 янв 12, 21:26    [11979504]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
начинающий sql-гуру
Knyazev Alexey
SELECT 
    d.client, SUM( distinct d.rest)
FROM #data d
GROUP BY d.client


а так?

Вау! Век живи век учись.
Спасибо!

Впервые вижу такой синтаксис.
С 2005-го появился или всегда был?
Всегда был.
У большинства агрегатных функций.
Уже давно идёт борьба с Microsoft, чтобы и в оконных агрегатных функциях можно было так же.
26 янв 12, 21:28    [11979510]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
начинающий sql-гуру
Группы могут быть разными (не обязательно первые).

Можно от одной группировки избавиться за счет оконных функций, но даст ли это ускорение тут хрен его знает... Проверять лучше на реальных данных, вот вам с нумерацией:
SELECT t.client, SUM(t.rest) FROM (
SELECT TOP 1 WITH TIES *
FROM 
    #data
ORDER BY ROW_NUMBER() OVER (PARTITION BY client, account ORDER BY groupp)
) t
GROUP BY t.client
26 янв 12, 21:29    [11979517]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
iap
Уже давно идёт борьба с Microsoft, чтобы и в оконных агрегатных функциях можно было так же.

А в 2012 не пофиксили?
Здесь Microsoft предлагает проголосовать за это ограничение.
27 янв 12, 09:26    [11980857]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
LelikB
iap
Уже давно идёт борьба с Microsoft, чтобы и в оконных агрегатных функциях можно было так же.

А в 2012 не пофиксили?
Не знаю. Не щупал. Его же ещё нет.
27 янв 12, 09:43    [11980910]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
kDnZP
Knyazev Alexey
SELECT 
    d.client, SUM( distinct d.rest)
FROM #data d
GROUP BY d.client



а так?

Бред. Проверить можно:
INSERT INTO #data
SELECT 1, 1, 1, 10 UNION ALL 
SELECT 1, 1, 2, 10 UNION ALL 
SELECT 1, 2,  1, 10 UNION ALL 
SELECT 1, 2,  2, 10  

Значит он делает DISTINCT не самому запросу, а так, как если бы выборка была только по конкретному группируемому полю?

Очень жаль.
27 янв 12, 10:48    [11981288]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
начинающий sql-гуру,

-- А вот этот НЕ посчитает правильно
SELECT 
    d.client, SUM(d.rest)
FROM 
    ( SELECT DISTINCT client, rest FROM #data ) d
GROUP BY d.client


Т.е. SUM( distinct d.rest) аналог второго (как вы ошибочно считали) верного вашего запроса.

А нужно:
-- А вот этот посчитает правильно
SELECT 
    d.client, SUM(d.rest)
FROM 
    ( SELECT DISTINCT client, account, rest FROM #data ) d
GROUP BY d.client
27 янв 12, 10:56    [11981321]     Ответить | Цитировать Сообщить модератору
 Re: Про SUM c DISTINCTом. (Наитупейший вопрос)  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
kDnZP
начинающий sql-гуру,

-- А вот этот НЕ посчитает правильно
SELECT 
    d.client, SUM(d.rest)
FROM 
    ( SELECT DISTINCT client, rest FROM #data ) d
GROUP BY d.client


Т.е. SUM( distinct d.rest) аналог второго (как вы ошибочно считали) верного вашего запроса.

А нужно:
-- А вот этот посчитает правильно
SELECT 
    d.client, SUM(d.rest)
FROM 
    ( SELECT DISTINCT client, account, rest FROM #data ) d
GROUP BY d.client

kDnZP, спасибо.
Это и имелось в виду: DISTINCT с account, но без group.
Опечатался просто.
27 янв 12, 11:06    [11981365]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить