Горизонтальный срез головного мозга
От: AC1D  
Дата: 10.03.11 12:02
Оценка:
Здравствуйте други

простой вопрос под конец рабочего дня котелок не варит ..

есть примерно такая таблица

id , SumDepart1 , SumDepart2, SumDepart3

нужно посчитать общую сумму всех департаментов на ID

можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?

Db:Oracle
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re: Горизонтальный срез головного мозга
От: GarryIV  
Дата: 10.03.11 12:03
Оценка:
Здравствуйте, AC1D, Вы писали:

ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?


Чем это тупо?
WBR, Igor Evgrafov
Re: Горизонтальный срез головного мозга
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 10.03.11 12:15
Оценка:
Здравствуйте, AC1D, Вы писали:

ACD>Здравствуйте други


ACD>простой вопрос под конец рабочего дня котелок не варит ..


ACD>есть примерно такая таблица


ACD> id , SumDepart1 , SumDepart2, SumDepart3


ACD> нужно посчитать общую сумму всех департаментов на ID


ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?


ACD> Db:Oracle


На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: Горизонтальный срез головного мозга
От: ASta Украина  
Дата: 10.03.11 14:20
Оценка: 4 (1)
Здравствуйте, Sshur, Вы писали:

S>Здравствуйте, AC1D, Вы писали:


ACD>>Здравствуйте други


ACD>>простой вопрос под конец рабочего дня котелок не варит ..


ACD>>есть примерно такая таблица


ACD>> id , SumDepart1 , SumDepart2, SumDepart3


ACD>> нужно посчитать общую сумму всех департаментов на ID


ACD>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?


ACD>> Db:Oracle


S>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.


1. IMHO в общем случае более подходящее: ... sum(NVL(sumdepart1, 0) + NVL(sumdepart2, 0) + NVL(sumdepart3, 0)) ... (или как там NVL юзают).
2. Что будет если добавиться sumdepart4, потом sumdepart5, ..., sumdepart300? IMHO в общем случае лучше вынести sumdepart в отдельную таблицу...
Re[3]: Горизонтальный срез головного мозга
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 10.03.11 14:24
Оценка:
Здравствуйте, ASta, Вы писали:


S>>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.


AS>1. IMHO в общем случае более подходящее: ... sum(NVL(sumdepart1, 0) + NVL(sumdepart2, 0) + NVL(sumdepart3, 0)) ... (или как там NVL юзают).


NVL — проверка на null? топикстартер про возможные null ничего не говорил

AS>2. Что будет если добавиться sumdepart4, потом sumdepart5, ..., sumdepart300? IMHO в общем случае лучше вынести sumdepart в отдельную таблицу...



Если их много и/или они будут добавляться — то можно попытаться сделать, чтобы они были в строках в отдельной таблице, а не в столбцах. вот тогда sum будет хорошо работать.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: Горизонтальный срез головного мозга
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 10.03.11 14:24
Оценка:
Здравствуйте, AC1D, Вы писали:

ACD>простой вопрос под конец рабочего дня котелок не варит ..


ACD>есть примерно такая таблица


ACD> id , SumDepart1 , SumDepart2, SumDepart3


ACD> нужно посчитать общую сумму всех департаментов на ID


ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?


ACD> Db:Oracle


Кстати, если ID — PK (т.е. уникальный) вроде как и sum() не нужен, если я правильно понимаю "сумму всех департаментов на ID".
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re: Горизонтальный срез головного мозга
От: Neco  
Дата: 10.03.11 18:53
Оценка:
Здравствуйте, AC1D, Вы писали:

ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?

Если уже кто-то тупо создал приведённую "примерную" таблицу, в которой зачем-то разодрал суммы одинаковой природы по разным колонкам, то теперь уже конечно ничего не поделаешь кроме как также тупо их склеивать через sum(sumdepart1+sumdepart2+sumdepart3). Т.е. если есть возможность посмотреть на оригинальные данные, то я бы посоветовал воспользоваться ими вместо использования таблицы уже "испорченной" визуальным удобством.
всю ночь не ем, весь день не сплю — устаю
Re[2]: Горизонтальный срез головного мозга
От: AC1D  
Дата: 11.03.11 03:30
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, AC1D, Вы писали:


ACD>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?


GIV>Чем это тупо?


Я просто думал есть более интелектуальный способ
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[2]: Горизонтальный срез головного мозга
От: AC1D  
Дата: 11.03.11 03:30
Оценка:
Здравствуйте, Sshur, Вы писали:

S>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.


Там их не 3, а штук 8 . 3 я для примера написал. И я не уверен что их больше не станет.. Разрабатываю структуру бд не я..
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[2]: Горизонтальный срез головного мозга
От: AC1D  
Дата: 11.03.11 03:30
Оценка:
Здравствуйте, Neco, Вы писали:

N>Здравствуйте, AC1D, Вы писали:


ACD>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?

N>Если уже кто-то тупо создал приведённую "примерную" таблицу, в которой зачем-то разодрал суммы одинаковой природы по разным колонкам, то теперь уже конечно ничего не поделаешь кроме как также тупо их склеивать через sum(sumdepart1+sumdepart2+sumdepart3). Т.е. если есть возможность посмотреть на оригинальные данные, то я бы посоветовал воспользоваться ими вместо использования таблицы уже "испорченной" визуальным удобством.

блин придется тупо склеивать.. бд не моя.
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[3]: Горизонтальный срез головного мозга
От: AC1D  
Дата: 11.03.11 03:30
Оценка:
Здравствуйте, ASta, Вы писали:

AS>1. IMHO в общем случае более подходящее: ... sum(NVL(sumdepart1, 0) + NVL(sumdepart2, 0) + NVL(sumdepart3, 0)) ... (или как там NVL юзают).

AS>2. Что будет если добавиться sumdepart4, потом sumdepart5, ..., sumdepart300? IMHO в общем случае лучше вынести sumdepart в отдельную таблицу...
Раскажите про отдельную таблицу?
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re[3]: Горизонтальный срез головного мозга
От: ASta Украина  
Дата: 11.03.11 18:32
Оценка: 2 (1)
Здравствуйте, AC1D, Вы писали:

ACD>Здравствуйте, Sshur, Вы писали:


S>>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.


ACD>Там их не 3, а штук 8 . 3 я для примера написал. И я не уверен что их больше не станет.. Разрабатываю структуру бд не я..


Разработчикам структуры — привет.
Правильнее что-то типа: TableDepartSums (DepartId, SumValue) -- DepartId — PK, FK на Departs или как их там

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

2 SSur:
>Если их много и/или они будут добавляться — то можно попытаться сделать, чтобы они были в строках в отдельной таблице, а не в >столбцах. вот тогда sum будет хорошо работать.
Именно это я в виду и имел. Наверное вы правы, в том смысле что надо было сформулировать яснее.
Re[4]: Горизонтальный срез головного мозга
От: ASta Украина  
Дата: 11.03.11 18:38
Оценка:
Здравствуйте, Sshur, Вы писали:


S>>>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.


AS>>1. IMHO в общем случае более подходящее: ... sum(NVL(sumdepart1, 0) + NVL(sumdepart2, 0) + NVL(sumdepart3, 0)) ... (или как там NVL юзают).


S>NVL — проверка на null? топикстартер про возможные null ничего не говорил

NVL(sumdepart1, 0) — "if (sumdepart1 not is null) then return sumdepart1 else return 0"
От проектировщиков способных на вышеописанное (а позже топик стартер признался что их там 8 штук) хорошего ждать не приходиться.

AS>>2. Что будет если добавиться sumdepart4, потом sumdepart5, ..., sumdepart300? IMHO в общем случае лучше вынести sumdepart в отдельную таблицу...


S>Если их много и/или они будут добавляться — то можно попытаться сделать, чтобы они были в строках в отдельной таблице, а не в столбцах. вот тогда sum будет хорошо работать.

Я уже написал. Это я и предлагал.
Re[3]: Горизонтальный срез головного мозга
От: ASta Украина  
Дата: 15.03.11 21:46
Оценка: 2 (1)
Здравствуйте, AC1D, Вы писали:

ACD>Здравствуйте, Neco, Вы писали:


N>>Здравствуйте, AC1D, Вы писали:


ACD>>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?

N>>Если уже кто-то тупо создал приведённую "примерную" таблицу, в которой зачем-то разодрал суммы одинаковой природы по разным колонкам, то теперь уже конечно ничего не поделаешь кроме как также тупо их склеивать через sum(sumdepart1+sumdepart2+sumdepart3). Т.е. если есть возможность посмотреть на оригинальные данные, то я бы посоветовал воспользоваться ими вместо использования таблицы уже "испорченной" визуальным удобством.

ACD>блин придется тупо склеивать.. бд не моя.


Предлагал уже: сделай себе view типа

select ... , sumdepart1 AS SumDepart
FROM t1

UNION ALL
select ... , sumdepart2 AS SumDepart
FROM t1

UNION ALL
select ... , sumdepart2 AS SumDepart
FROM t1

и наслаждайся.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.