Здравствуйте, AC1D, Вы писали:
ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?
Здравствуйте, 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) самое подходящее.
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Здравствуйте, 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 в отдельную таблицу...
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 будет хорошо работать.
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Здравствуйте, 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".
Здравствуйте, AC1D, Вы писали:
ACD> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?
Если уже кто-то тупо создал приведённую "примерную" таблицу, в которой зачем-то разодрал суммы одинаковой природы по разным колонкам, то теперь уже конечно ничего не поделаешь кроме как также тупо их склеивать через sum(sumdepart1+sumdepart2+sumdepart3). Т.е. если есть возможность посмотреть на оригинальные данные, то я бы посоветовал воспользоваться ими вместо использования таблицы уже "испорченной" визуальным удобством.
Здравствуйте, GarryIV, Вы писали:
GIV>Здравствуйте, AC1D, Вы писали:
ACD>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!?
GIV>Чем это тупо?
Здравствуйте, Sshur, Вы писали:
S>На MSSQL можно получить список всех колонок таблицы, написать скрипт который напишет динамический SQL, суммирующий колонки по определенному критерию. На Оракле скорее всего это тоже можно, но нафига? Ладно бы у вас было 100 колонок и в разных случаях надо было бы суммировать по разному. Для трех колонок ИМХО sum(sumdepart1+sumdepart2+sumdepart3) самое подходящее.
Там их не 3, а штук 8 . 3 я для примера написал. И я не уверен что их больше не станет.. Разрабатываю структуру бд не я..
Здравствуйте, Neco, Вы писали:
N>Здравствуйте, AC1D, Вы писали:
ACD>> можно конечно сделать тупо select id,sum(sumdepart1+sumdepart2+sumdepart3) as Total from t1 group by id, но есть ли способ умнее?!? N>Если уже кто-то тупо создал приведённую "примерную" таблицу, в которой зачем-то разодрал суммы одинаковой природы по разным колонкам, то теперь уже конечно ничего не поделаешь кроме как также тупо их склеивать через sum(sumdepart1+sumdepart2+sumdepart3). Т.е. если есть возможность посмотреть на оригинальные данные, то я бы посоветовал воспользоваться ими вместо использования таблицы уже "испорченной" визуальным удобством.
Здравствуйте, ASta, Вы писали:
AS>1. IMHO в общем случае более подходящее: ... sum(NVL(sumdepart1, 0) + NVL(sumdepart2, 0) + NVL(sumdepart3, 0)) ... (или как там NVL юзают). AS>2. Что будет если добавиться sumdepart4, потом sumdepart5, ..., sumdepart300? IMHO в общем случае лучше вынести sumdepart в отдельную таблицу...
Раскажите про отдельную таблицу?
Здравствуйте, 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 будет хорошо работать.
Именно это я в виду и имел. Наверное вы правы, в том смысле что надо было сформулировать яснее.
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 будет хорошо работать.
Я уже написал. Это я и предлагал.
Здравствуйте, 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