Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1334672711
новичок2012
2012-04-17 18:25
2013.03.22
Ссылка на контролы класса TCombobox и TEdit


15-1353797738
DevilDevil
2012-11-25 02:55
2013.03.22
Перехватить любой Exception и подменить текст


1-1301292905
Alex_C
2011-03-28 10:15
2013.03.22
Перевод из координат экрана в пространство


15-1341906232
Неграмотный
2012-07-10 11:43
2013.03.22
Неподтверждён или "не подтверждён" (слитно или раздельно)


15-1351925332
LLLL
2012-11-03 10:48
2013.03.22
Странный вопрос о браузерах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский