MxSv
Дата: 22.12.2011 16:19:28
Здравствуйте, форумчане!
Подскажите, плз, насчет такой ситуации.
Есть две таблицы:
Tabl1
Id Признак
1 м
2 т
3 м
4 т
Tabl2
… Признак 1 2 3 4
м 0 1 0 1
Id из первой таблицы соответствует именам столбов второй
Задача: сгруппировать "Признак" первой таблицы и по нему получить сумму по столбцам второй таблицы.
Т.е. Для признака "м" должна получиться сумма столбца "1" и "3" (признак м имеет id 1 и 3, т - 2 и 4)
Я пошел таким путем:
Для первой таблицы сделал запрос1 с конкатенацией, результатом которого получается следующее:
Признак Выражение
м [1]+[3]
т [2]+[4]
Вопрос заключается в том, как использовать [1]+[3] для получения суммы.При связывании запроса1 и таблицы1 по признаку Eval([Выражение])/Eval("[Выражение]") выдает ошибку, хотя Eval([1]+[3]) нормально работает. В чем я накосячил?
Заранее спасибо!
MxSv
Дата: 22.12.2011 16:38:43
Ошибочка при написании вышла. Читать "При связывании запроса1 и таблицы2"
Akina
Дата: 22.12.2011 17:04:50
Нормируйте вторую таблицу в (Признак-ИД-Значение), и всё станет легко и просто.
MxSv
Дата: 22.12.2011 17:16:07
Akina, спасибо за ответ!
Но я спрашивал, в чем я накосячил с Eval.
Нормировать таблицу ради данного подсчета не хочется (на таблицу завязана куча запросов и процедур)
Akina
Дата: 22.12.2011 18:24:20
MxSv |
---|
Нормировать таблицу ради данного подсчета не хочется (на таблицу завязана куча запросов и процедур) |
Так нормализуй её, нормализованной таблице дай дргое имя, а с этим именем сделай запрос, воссоздающий ненормализованный вид. И всё... ну а потом не спеша можно передать всё, что на неё было подвязано, после чего запрос наконец тихо удавить...
Akina
Дата: 22.12.2011 18:25:08
MxSv |
---|
Нормировать таблицу ради данного подсчета не хочется (на таблицу завязана куча запросов и процедур) |
Так нормализуй её, нормализованной таблице дай другое имя, а с этим именем сделай запрос, воссоздающий ненормализованный вид. И всё... ну а потом не спеша можно переделать всё, что на неё было подвязано, после чего запрос наконец тихо удавить...
mds_world
Дата: 22.12.2011 18:34:13
Без евалов.
Попробуйте
select t.Признак, sum(q.p) as summa
from
(select 1 as f, [1] as p from Tabl2
union all
select 2 as f, [2] as p from Tabl2
union all
select 3 as f, [3] as p from Tabl2
union all
select 4 as f, [4] as p from Tabl2) q inner join Tabl1 t on q.f=t.id
group by t.Признак
MxSv
Дата: 22.12.2011 18:48:48
Извиняюсь, если налил много лишних слов в объяснении проблемы.
Меня интересует вопрос, КАК ИСПОЛЬЗОВАТЬ (И МОЖНО ЛИ) СТРОКУ С ИМЕНАМИ ПОЛЕЙ ТАБЛИЦЫ вида [1]+[2] или [1]/[2]+1 или [1] & [2] и т.д. в запросе для получения значений.
Для эксперимента я сделал в таблице 2 дополнительное текстовое поле ХХХ, куда поместил: [1]+[2].
Так вот в запросе если написать Eval([ХХХ]) или Eval("[ХХХ]") выдает ошибку, хотя, как я уже говорил, Eval([1]+[2]) прекрасно работает.
В чем косяк?
ЗЫ: Не очень хорошо, что вместо исходной таблицы 2 будет перекрестный запрос (формы слетят к черту), а потихонечку не получится (надо, как всегда, вчера).
MxSv
Дата: 22.12.2011 18:58:53
mds_world, спасибо!
Но таких полей может быть до чертиков. Конечно, мне никто не мешает создать такой запрос программно, но ситуация, если надо не сложить, а сделать[1] & [2], опять требует конкатенации. При этом в Таблице1 порядка 100 записей (справочник), а в Таблице2 может быть до 100000. Естественно, конкатенация мне предпочтительней для Табл1.
Повторюсь:
Меня интересует вопрос, КАК ИСПОЛЬЗОВАТЬ (И МОЖНО ЛИ) СТРОКУ С ИМЕНАМИ ПОЛЕЙ ТАБЛИЦЫ вида [1]+[2] или [1]/[2]+1 или [1] & [2] и т.д. в запросе для получения значений.
Для эксперимента я сделал в таблице 2 дополнительное текстовое поле ХХХ, куда поместил: [1]+[2].
Так вот в запросе если написать Eval([ХХХ]) или Eval("[ХХХ]") выдает ошибку, хотя, как я уже говорил, Eval([1]+[2]) прекрасно работает.
В чем косяк?
Akina
Дата: 22.12.2011 22:05:58
ты хочешь сказать, что запрос
select *
from table
where (Eval([1]+[2]) <> ([1]+[2]))
and (not IsNull([1]))
and (not IsNull([2]))
возвращает непустой набор записей?