Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизAdoQuery SQL Найти похожие ветки
← →
samuilus © (2012-10-21 16:42) [0]Здравствуйте помогите разобраться ?
есть Adoconnection, ADOQuery1, DataSource1- все связанно и призанно к сетке DBGrid.
есть 2 таблицы в ACCESS :
1) - tab1
структура:
---------------------------
id | name_c | count_t |
---------------------------
1 | ручки | |
---------------------------
2 | карандаши | |
---------------------------
3 | мячи | |
---------------------------
2) - tab2
структура:
----------------------------
id | name_t | count_t |
--------------------------------
1 | мыч синий | 1 |
--------------------------------
1 | мяч красный | 15 |
--------------------------------
2 | ручка зеленая | 40 |
--------------------------------
2 | ручка красная | 12 |
--------------------------------
У меня Вопрос в следующем : Необходимо составить SQL запрос так что бы товар из 2 таблицы суммировался ( соответственно для каждой группы товара) и подставлялся в DBGrid к Первой таблице.
Пробовал для вывода второй таблицы так:
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("SELECT SUM(name_t) As name_t FROM tab1 GROUP BY id ");
ADOQuery.Active:=True;
Все работает, НО МНЕ НУЖНО ЧТОБЫ РЕЗУЛЬТАТ СУММИРОВАНИЯ ДЛЯ КАЖДОЙ ГРУППЫ ПОДСТАВЛЯЛСЯ К ПЕРВОЙ ТАБЛИЦЕ.
Делал так :
k:=DBGrid1.DataSource.DataSet.fieldbyname("ID");
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("SELECT name_c, (SUM(count_t) FROM tab2 WHERE id="+inttostr(k)+" ) AS count_t FROM tab1 ");
ADOQuery.Active:=True;
пишет: ошибка синтаксиса (пропушен оператор) в выражении запроса
ПОМОГИТЕ ПОЖАЛУЙСТА
← →
sniknik © (2012-10-21 17:31) [1]> Необходимо составить SQL запрос так что бы товар из 2 таблицы суммировался ( соответственно для каждой группы товара) и подставлялся в DBGrid к Первой таблице.
учи объединения... т.е. операция join. и соединяй таблицу групп (как есть) с сгруппированной "таблицей" количеств, полученной из таблицы товаров...
что именно тебе лучше знать, непонятно зачем суммируешь "штуки с килограммами" и что это будет значить, похоже тут что-то не то.
> пишет: ошибка синтаксиса (пропушен оператор) в выражении запроса
правильно пишет, запросSELECT name_c, (SUM(count_t) FROM tab2 WHERE id=1) AS count_t FROM tab1
бредовый. исправь.
← →
sniknik © (2012-10-21 17:37) [2]> учи объединения... т.е. операция join.
вообще, можно и под запросом... как ты видать пытаешься, но join в большинстве случаев быстрее, и потому правильнее.
вот если бы ты выбирал из миллиона пару записей, и только для них делался под запрос, и "отвалился" оптимизатор... тогда да, могло бы и под запросом быстрее.
← →
samuilus © (2012-10-21 19:18) [3]Вообще опишу суть программы.
Есть 1 таблица в ней имена организаций.
2 таблица- счета с товарами относящиеся по ID к каждой организации, вот мне и нужно во второй таблице суммировать каждый товар а к первой таблице, в гриде выводить напротив каждой организации кол-во товара относящееся к каждой организации.
← →
sniknik © (2012-10-21 19:30) [4]> Вообще опишу суть программы.
> ...
добавить нечего, "операция join" - суть ответа. ничего не изменилось.
← →
Inovet © (2012-10-21 19:33) [5]> [3] samuilus © (21.10.12 19:18)
В одном счёте один товар? Пусть один. Будешь складывать 10 тонн цемента, 100 литров бензина и 50 кг яблок?
← →
samuilus © (2012-10-21 19:33) [6]А где почитать лучше про это ?
← →
sniknik © (2012-10-21 19:40) [7]почитать в книжках, хелпе, доках, инете...
© ваш КА
p.s. пример, весьма приблизительный... может не заработать, результат точно "не о чем", просто принципSELECT
t.ID, tt.Cnt
FROM tab1 t
INNER JOIN (SELECT ID, Count(*) AS Cnt FROM tab2 GROUP BY ID) tt ON t.ID=tt.ID
← →
samuilus © (2012-10-21 19:50) [8]нет вот смотрите как
DBGrid 1
организация | яблоки | помидоры | арбузы |
--------------------------------------------------------------
фирма 1 | 10 | 20 | 40 |
---------------------------------------------------------------
тоесть 1 грид берет название организаций из первой таблицы а сумма товаров подставляется запросом sum() из второй
DBGrid2
№ Счета | Дата | яблоки | помидоры | арбузы |
-------------------------------------------------------------------------
1234 | 20.10.2012 | 4 | 15 | 5 |
-------------------------------------------------------------------------
3445 | 21.10.2012 | 4 | | 35 |
-------------------------------------------------------------------------
5678 | 22.10.2012 | 2 | 5 | |
--------------------------------------------------------------------------
Ну и соответственно при клике на строке 1-го грида во втором гриде отображаются счета относящиеся к организации в первом гриде вот суть программы
← →
Inovet © (2012-10-21 20:08) [9]> [8] samuilus © (21.10.12 19:50)
> нет вот смотрите как
Это исходная структура, так в базе хранится?
← →
samuilus © (2012-10-21 20:16) [10]Нет так должно выводится на форме тоесть 1грид сверху второй пониже как я и начертил
← →
sniknik © (2012-10-21 20:19) [11]это называется master-detail, и тут одним запросом не обойтись... тут программировать нужно. внезапно.
← →
sniknik © (2012-10-21 20:22) [12]+ "счета" вот в такой повернутой форме, называются pivot-таблицей... или "шахматкой" если в терминах 1С.
p.s. достаточно новых слов для поиска-изучения?
← →
Inovet © (2012-10-21 20:25) [13]> [10] samuilus © (21.10.12 20:16)
У тебя тут главное - плавающая ширина. Это pivot нужен, точнее, не нужен, потому что так делать не очень хорошо. В генераторах отчётов ещё можно для печати на несколько, может получиться, листов. В ФР даже специальные средства для этого есть.
← →
sniknik © (2012-10-21 20:32) [14]> плавающая ширина. Это pivot нужен, точнее, не нужен, потому что так делать не очень хорошо.
так делать нормально... если нужно именно это. и с плавающей шириной проблем нет, т.к. обычно используется под что то определенное, под разбивку по месяцам/кварталам например.
проблемы только если не по назначению использовать... но раз уж начал со сложения штук с килограммами... ему к ним не привыкать.
← →
samuilus © (2012-10-21 20:33) [15]ПИПЕЦ неужели так все серьезно ?
← →
samuilus © (2012-10-21 20:36) [16]
> но раз уж начал со сложения штук с килограммами... ему к
> ним не привыкать.
О чем ты вообще говоришь ?
Вы меня я так понимаю не понячли что я хочу сделать
← →
sniknik © (2012-10-21 20:37) [17]> неужели так все серьезно ?
нет конечно... программисты вообще просто так зарплату получают. а все эти термины, сложности,т.д., это они так, цену себе набивают. "рисуются".
← →
sniknik © (2012-10-21 20:39) [18]> Вы меня я так понимаю не понячли что я хочу сделать
мы поняли именно так как ты сказал. что характерно, оба два, одинаково... сравни ответы. если говоря одно ты имел в виду другое, ну тогда извини.
← →
Inovet © (2012-10-21 20:43) [19]> [14] sniknik © (21.10.12 20:32)
> так делать нормально...
Да можно, конечно, и в гриде такое выводить. Только надо ли номенклатуру разворачивать в ширину.
← →
samuilus © (2012-10-21 20:47) [20]а нельзя разве сделать так:
структура 1 таблицы:
id / name /
---------------
1 фирма 1
---------------
2 фирма 2
----------------
вывести в грид
затем программно добавить к этому гриду поля с суммами sum() из второй таблицы по ID ?
структура 2 таблицы
id / яблоки / арбузы / помидоры /
---------------------------------------
1 4 5 6
----------------------------------------
1 4 6
-----------------------------------------
2 5
чтобы потом получилось следующее
ГРИД :
организация / яблоки / арбузы / помидоры /
фирма 1 8 11 6 /
-----------------------------------------------------
фирма2 5 /
------------------------------------------------------
← →
Inovet © (2012-10-21 20:52) [21]Вот посмотри как в ФР это делается
Сводные отчеты. Позволяют строить табличные отчеты со сложными (составными) заголовками, используя данные из одного источника. Аналог многомерных кубов (OLAP) без возможности динамического управления. иллюстрация
http://www.fast-report.com/screenshots/9_cross.gif
Вот здесь есть Демонстрационная версия и триал
http://www.fast-report.com/ru/download/fastreport.net-download.html
← →
Inovet © (2012-10-21 20:54) [22]> [21] Inovet © (21.10.12 20:52)
> http://www.fast-report.com/ru/download/fastreport.net-download.html
Это для NET, вот для VCL
http://www.fast-report.com/ru/download/fast-report-4-download.html
← →
Inovet © (2012-10-21 20:57) [23]> [20] samuilus © (21.10.12 20:47)
> затем программно добавить к этому гриду поля с суммами sum()
> из второй таблицы по ID ?
Не к гриду, а к датасету.
← →
samuilus © (2012-10-21 21:02) [24]
> Не к гриду, а к датасету.
Ну да к датасету. Можно же так реализовать?
← →
sniknik © (2012-10-21 21:07) [25]> а нельзя разве сделать так:
МОЖНО ВСЕ!!! ... кроме того, что нельзя.
master-detail + pivot.
> Аналог многомерных кубов (OLAP)
;о)) ну ты ему сейчас ничего не упростил... олап еще изучать.
ему, ИМХО, нужен "волшебный компонент" типа положил на форму и готово. ну такое впечатление складывается.
← →
samuilus © (2012-10-21 21:10) [26]ладно спасибо за подсказку куда рыть. Честно говоря устал уже от подкусываний ваших. Сами родились сразу умными, я нет чтож поделать не судьба
← →
samuilus © (2012-10-21 21:35) [27]
> p.s. пример, весьма приблизительный... может не заработать,
> результат точно "не о чем", просто принцип
> SELECT
> t.ID, tt.Cnt
> FROM tab1 t
> INNER JOIN (SELECT ID, Count(*) AS Cnt FROM tab2 GROUP BY
> ID) tt ON t.ID=tt.ID
Спасибо это именно то что мне нужно все работает как и хотелось.
← →
Inovet © (2012-10-21 21:50) [28]> [25] sniknik © (21.10.12 21:07)
> > Аналог многомерных кубов (OLAP)
> ;о)) ну ты ему сейчас ничего не упростил... олап еще изучать.
>
> ему, ИМХО, нужен "волшебный компонент" типа положил на форму и готово.
В фР с этими коросстаблицами так и есть - кинул и готово, почти. Сабж практически так и сделается киданием, подготовить исходный набор тоже не проблема. А изучить... ну так надо будет. В демке всё понятно, сам её давно уже глядел, подробности не помню.
← →
Inovet © (2012-10-21 21:52) [29]> [27] samuilus © (21.10.12 21:35)
Вроде бы другое хотелось. Ну да ладно.
← →
Студент (2012-10-22 05:10) [30]ADOQuery.SQL.Add("SELECT name_c, (SUM(count_t) FROM tab2 WHERE tab2.id=tab1.id) AS count_t FROM tab1 ");
← →
MsGuns © (2012-10-22 10:55) [31]Очередной "складописание" :)
Если надо реально рабочую программу по учету, то 1С - самое быстрое и дешевое решение.
Если "для зачета" или "помочь маме-главбуху", то читать срочно про складской учет: товарные книги, приходно-расходные накладные, карточки, оборотные ведомости и т.д.
Тренироваться лучше всего в Экселе (самый быстрый способ сделать маме приятно), потом в акцесе. Когда в голове перестанут возникать вопросы-промокашки типа сабжевого - переходить на клиент-сервер.
← →
AV © (2012-10-22 12:20) [32]select 1 ID, "МЯЧ" NAM, "-" COMM into T_TAB_NAME;
insert into T_TAB_NAME values (2, "ДУШ", "");
insert into T_TAB_NAME values (3, "РОГ", "");
select * from T_TAB_NAME
select 1 ID, "МЯЧ ЗЕЛЕНЫЙ" NAM, 10 CNT into T_TAB_JOURN;
insert into T_TAB_JOURN values (1, "МЯЧ КРАСНЫЙ", 15);
insert into T_TAB_JOURN values (2, "ВЕРТИКАЛЬН", 5);
insert into T_TAB_JOURN values (2, "ГОР-ТАЛЬН", 8);
select * from T_TAB_JOURN
select * from T_TAB_NAME N
join T_TAB_JOURN J on J.ID = N.ID
select N.ID, N.NAM, sum(J.CNT)
from T_TAB_NAME N
join T_TAB_JOURN J on J.ID = N.ID
group by N.ID, N.NAM
← →
samuilus © (2012-10-28 22:06) [33]Удалено модератором
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.062 c