Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.051 c
11-1245415115
West
2009-06-19 16:38
2013.03.22
Application.Exename and etc. в KOL


15-1334144994
Дмитрий С
2012-04-11 15:49
2013.03.22
Что вообще такое SLIC?


15-1350643594
Grimm375
2012-10-19 14:46
2013.03.22
Информировать, какие символы разрешено вводить


2-1328128979
Karabaz
2012-02-02 00:42
2013.03.22
Приложение жоско залипает


15-1333088061
macrodens
2012-03-30 10:14
2013.03.22
Outlook 2007