|
|
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Нужно выполнить запрос в рез которого будет текстовое выражение, получившееся путем сложения текстовых полей в выборке т.е. Таблица: Поле1 ------- Строка1 Строка2 Строка3 Строка4 после выборки имеем одну запись с полем Строка1Строка2Строка3Строка4 Возможно ли такое и как это сделать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 14:33:32 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
За этот месяц отправляю сюда за идеей,наверное, уже 4-го вопрошающего Остальные сейчас запостят предложения по GetStrings и у меня опять будет дежавю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 14:38:56 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Извиняюсь забыл добавить С базой работаю на DELPHI через ADO и не с SQL Server а с Аксесовской базой... Соответственно речь о процедурах и функциях идти не может... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 14:42:07 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
>Соответственно речь о процедурах и функциях идти не может... Что в DELPHI уже и не язык программирования? Главаное - идея. А как ты ее реализуешь ... дело пятое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 14:45:33 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Нужно это реализовать в одном запросе без программирования на других яз. Суть: есть 3 таблицы Клиенты ID Клиент -------- -------- 1 Клиент1 2 Клиент2 3 Клиент3 Распоряжения ID Nраспор ---- --------- 222 Номер1 223 Номер2 224 Номер3 225 Номер2 Связь ID_Клиента ID_Распоряжения ----------- ------------------ 1 222 2 223 3 224 2 225 Суть - каждому клиенту может быть сопоставлено неколько распоряжений А теперь надо сделать выборку клиентов с их распоряжениями!!! И тут плодить по каждому клиенту несколько записей - нельзя В результате выборки должно быть: Клиент1 | Номер1 Клиент2 | Номер2 Номер4 Клиент3 | Номер3 Как это сделать? Если бы SUM умела складывать текстовые поля то запрос бы выглядел так: SELECT Клиенты.Клиент, ( SELECT SUM(NРаспор) FROM Распоряжения WHERE ID in (SELECT ID_Распоряжения FROM Связь WHERE ID_Клиента=Клиенты.ID) ) as Номера_Документов FROM Клиенты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 14:59:37 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
>Нужно это реализовать в одном запросе без программирования на других яз. Это что, задачка на сообразительность? Именно 1 запросом и без программирования??? Тогда, извини... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:04:59 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Это не задачка это проблема.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:07:19 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Если в том одном языке есть соотствующая функция (аналог Sum для стрингов), тогда хорошо. Если нет, тогда плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:08:11 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Это что всё что вы можете посоветовать??? Где все спецы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:11:41 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Постановка задачи: исполнить одной строкой то, что на данном языке одной строкой не делается. Кто скажет, что эта задача разрешима, пусть бросит в меня камень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:13:42 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Может, в форуме по Дельфи подскажут, каким синтаксисом это достигается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:15:00 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Да дельфи тут совсем не причем!!! На аксесе как - не прибегая к процедурам макросам, юзерским функциям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:16:43 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Могу только посоветовать сделать методом грубой силы 1.Открываешь рекордсет 2 В цикле перебираешь все записи и конкатенируешь нужные поля. Я думаю Дельфи это позволяет сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:20:59 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
VIG Спасибо, но это не подходит.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:21:42 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
В Аксессе (если его рассматривать только как сервер) такой возможности нет . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:23:10 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Спасибо, но это не подходит.. Тоди ой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 15:24:47 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Есть достаточно муторное, но универсальное решение этой задачи Суть его в следующем: создается таблица результата TRez с ключевым полем ID_Клиент и полями IR,IR1,IR2 … IR20 для ID_Распоряжения по каждому клиенту Формируется набор запросов на добавление в эту таблицу сначала самых «длинных» наборов распоряжений, затем более коротких. Так как ID_Клиент ключевое поле, после «длинного» набора, короткий не запишется Для работы запроса в таблицу СВЯЗЬ нужно добавить поле счетчика ID Теперь вид самого запроса : для 4 распоряжений одному клиенту INSERT INTO TRez ( ID_Клиента, IR, IR1, IR2, IR3 ) SELECT С3.ID_Клиента, С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения, С3.ID_Распоряжения FROM ((Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента) LEFT JOIN Связь AS С3 ON С2.ID_Клиента = С3.ID_Клиента WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]) AND ((С3.id)>[С2].[ID])); Ключевой здесь является строка WHERE, убирающая перестановки ID_Распоряжения и выводящая их в порядке возрастания счетчика ID в таблице связь для 3 распоряжений одному клиенту INSERT INTO TRez (ID_Клиента, IR, IR1, IR2 ) SELECT С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения FROM (Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID])); для 2 распоряжений одному клиенту INSERT INTO TRez (ID_Клиента, IR, IR1 ) SELECT С.ID_Распоряжения, С1.ID_Распоряжения FROM Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента WHERE (((С1.id)>[С].[ID])); для 1 распоряжениz одному клиенту INSERT INTO TRez ( ID_Клиента, IR ) SELECT С.ID_Клиента, С.ID_Распоряжения FROM Связь AS С; Дальше все просто. Мастеришь 20 идентичных запросов на добавление. Имена им даешь такие, чтобы было удобно генерить это имя в программе с циклом, например Q_4, Q_3, … Q_1. В самом крутом запросе связаны 20 таблиц Связь, в самом простом = одна таблица. Удаляешь все из таблицы TRez . Программно запускаешь запросы Q_20 ...Q_1 в порядке убывания крутизны, и получаешь в таблице TRez что хотел. На VB это выглядит так For i=20 to 1 step –1 Currentdb.execute “Q_” & i Next i результат в TRez для твоего примера будет следующим ID_Клиента IR IR1 IR2 IR3 1 222 2 223 225 3 224 Затем к каждому полю IR,IR1…в таблице Trez цепляешь LEFT JOIN таблицы Распоряжения, а к полю ID_Клиент таблицу Клиенты и делаешь конкатенацию полей Nраспор, чтобы получилось искомое Клиент2 | Номер2 Номер4 Номер6 Номер8 Муторность в том, что если заранее число полей IR,IR1… не известно, приходится страховаться и мастерить много идентичных запросов на добавление, Правда, работают они быстро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 07:04:36 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
http://hiprog.com/access/article.asp?id=334 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 07:10:33 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Есть достаточно муторное, но универсальное решение этой задачи Суть его в следующем: создается таблица результата TRez с ключевым полем ID_Клиент и полями IR,IR1,IR2 … IR20 для ID_Распоряжения по каждому клиенту Формируется набор запросов на добавление в эту таблицу сначала самых «длинных» наборов распоряжений, затем более коротких. Так как ID_Клиент ключевое поле, после «длинного» набора, короткий не запишется Для работы запроса в таблицу СВЯЗЬ нужно добавить поле счетчика ID Теперь вид самого запроса : для 4 распоряжений одному клиенту INSERT INTO TRez ( ID_Клиента, IR, IR1, IR2, IR3 ) SELECT С3.ID_Клиента, С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения, С3.ID_Распоряжения FROM ((Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента) LEFT JOIN Связь AS С3 ON С2.ID_Клиента = С3.ID_Клиента WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID]) AND ((С3.id)>[С2].[ID])); Ключевой здесь является строка WHERE, убирающая перестановки ID_Распоряжения И выводящая их в порядке возрастания счетчика ID в таблице связь для 3 распоряжений одному клиенту INSERT INTO TRez (ID_Клиента, IR, IR1, IR2 ) SELECT С.ID_Распоряжения, С1.ID_Распоряжения, С2.ID_Распоряжения FROM (Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента) LEFT JOIN Связь AS С2 ON С1.ID_Клиента = С2.ID_Клиента WHERE (((С1.id)>[С].[ID]) AND ((С2.id)>[С1].[ID])); для 2 распоряжений одному клиенту INSERT INTO TRez (ID_Клиента, IR, IR1 ) SELECT С.ID_Распоряжения, С1.ID_Распоряжения FROM Связь AS С LEFT JOIN Связь AS С1 ON С.ID_Клиента = С1.ID_Клиента WHERE (((С1.id)>[С].[ID])); для 1 распоряжения одному клиенту INSERT INTO TRez ( ID_Клиента, IR ) SELECT С.ID_Клиента, С.ID_Распоряжения FROM Связь AS С; Дальше все просто. Мастеришь 20 идентичных запросов на добавление. Имена им даешь такие, чтобы было удобно генерить это имя в программе с циклом, например Q_4, Q_3, … Q_1. В самом крутом запросе связаны 20 таблиц Связь, в самом простом = одна таблица. Удаляешь все из таблицы TRez . Программно запускаешь эти запросы в порядке убывания крутизны, и получаешь в таблице TRez что хотел. На VB это выглядит так For I=20 to 1 step –1 Currentdb.execute “Q_” & i Next I Результат будет таким ID_Клиента: IR: IR1 IR2 IR3 1 : 222 2 : 223 :225 3 : 224 Затем к каждому полю IR,IR1…в таблице Trez цепляешь LEFT JOIN таблицы Распоряжения, а к полю ID_Клиент таблицу Клиенты и делаешь конкатенацию строк, чтобы получилось Клиент2 | Номер2 Номер4 Номер6 Номер8 Муторность в том, что если заранее число полей IR,IR1… не известно, приходится страховаться и мастерить много идентичных запросов на добавление, Правда, работают они быстро ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 07:12:54 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
2 All: Время другое, проблема та же. ;) Есть таблица ID1, ID2, ID3, Data, причем ID1 и ID2 однозначно определяют ID3, а ID3 -> Data. Вопрос: как наименее "безболезненно" сделать конкатенацию всех строковых полей Data для пар (ID1, ID2)? Пересмотрены куча "рецептов" на форуме, где-то говориться про SQL2000, где-то еще про что-то, но у меня чистый -- Access2000. Можно использовать VBA, формулы, скрипты -- все. Как? Просто уже голова кругом. Сразу скажу: это -> http://hiprog.com/access/article.asp?id=334 почему-то не работает, хотя вроде для Access написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2004, 13:39:22 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
Даже не знаю, почему у тебя не работают примеры Юрия Шермана, но если быстродействие очень не критично, то для DAO можно попробовать такой простой варитант: Функция: Public Function DConcat(exp As String, source As String, Optional usl As String) As Variant On Error GoTo DConcat_err Dim MyDB As Database, MyTable As Recordset, tsql As String Set MyDB = CurrentDb() DConcat = "" tsql = "SELECT [" & source & "].[" & exp & "] FROM " & source & "" If usl <> "" Then tsql = tsql & " WHERE (" & usl & ")" End If tsql = tsql & ";" Set MyTable = MyDB.OpenRecordset(tsql) If MyTable.RecordCount > 0 Then MyTable.MoveFirst Do Until MyTable.EOF DConcat = DConcat & IIf(DConcat <> "", ",", "") & MyTable(exp) MyTable.MoveNext Loop End If Exit Function DConcat_err: DConcat = "" End Function Запрос: SELECT T.ID1, T.ID2, Dconcat("Date","T","([ID1] =" & [id1] & ") and (id2=" & [id2] & ")") AS v1 FROM T GROUP BY T.ID1, T.ID2; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2004, 14:42:45 |
|
||
|
HELP ! Срочно !! Суммирование по тесктовым полям
|
|||
|---|---|---|---|
|
#18+
2 GuestN: То есть, в принципе возможно написание своей функции с целью использованя ее в SQL-скриптах? У меня именно на этом шаге (ввод выражения в запросе) не работали примеры, ссылка на которые дана выше. ----------------------- Попробую еще... :| ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2004, 16:00:45 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32208486&tid=1672486]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 324ms |

| 0 / 0 |
