Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше выписывать счета? 
V
    Опции темы
DenWPF
Дата 19.10.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



У меня стоит задача выписывать счет(зарплату) работнику когда он набирает минималку.

есть таблица "оборот" в которой записано "его ид\сумма" ( это кратко там есть и другие не важные для этого действия поля.
пример:
Оборот:
3\300
4\100
3\400

Счета будут выписывается в отдельную таблицу, когда челвоек набирает минималку ( к примеру сейчас минималка 500) в таблицу счет должно записываться 

зарплата
3\700  - это при условии что в таблице "зарплата" не было его же данных.

получается такая схема:
1.считать сколько каждый человек заработал в таблице "оборот"
2. отнять то что записано в "зарплата"
3. то что осталось проверить и создать или не создать новый счет(зарплата) 

вот третий пунк меня и интересует как лучше всего его делать?

я пишу на C#.

тут я вижу два варианта:
1. через sql делать  1 и 2 пункт, а в C# уже обработать данные и создать счет.
2. все сделать через sql, к примеру написать какой то тригер, который будет автоматически по поступлению данных создавать счита. - но этот способ я не знаю как сделать, не когда их не создавал. Это вообещ возможно?



PM MAIL   Вверх
Akina
Дата 20.10.2010, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Подсчёт общих сумм в таблице "зарплата"
Код

(
SELECT account.id, Sum(account.sum) AS a_sum
FROM account
GROUP BY account.id;
) AS q1

То же, в таблице "оборот"
Код

(
SELECT turnover.id, Sum(turnover.sum) AS t_sum
FROM turnover
GROUP BY turnover.id;
) AS q2

Собираем вместе
Код

(
SELECT q2.id, (q2.t_sum-COALESCE(q1.a_sum,0)) AS f_sum
FROM q1 RIGHT JOIN q2 ON q1.id = q2.id
WHERE q2.t_sum-COALESCE(q1.a_sum,0)>=500;
) AS q3
И выполняем апдейт
Код

INSERT INTO account ( id, `sum` )
SELECT q3.id, q3.f_sum
FROM q3;

Теперь только собери всё это без ошибок в один запрос.

Это сообщение отредактировал(а) Akina - 20.10.2010, 08:02


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DenWPF
Дата 20.10.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Цитата

Собираем вместе


А где те верхние запросы писать?

Код

(
SELECT q2.id, (q2.t_sum-COALESCE(q1.a_sum,0)) AS f_sum
FROM q1 RIGHT JOIN q2 ON q1.id = q2.id
WHERE q2.t_sum-COALESCE(q1.a_sum,0)>=500;
) AS q3




вместо FROM q1 поставить FROM (SELECT ...) as a1
а в место  RIGHT JOIN q2 поставить  RIGHT JOIN (SELECT ...) as a2

если да то у меня что то не получается=(

Цитата

И выполняем апдейт

а подробней, как это сделать для каждой строки
PM MAIL   Вверх
Akina
Дата 20.10.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DenWPF @  20.10.2010,  12:11 Найти цитируемый пост)
если да 

Да. 

Цитата(DenWPF @  20.10.2010,  12:11 Найти цитируемый пост)
не получается

Делай внимательнее.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DenWPF
Дата 20.10.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



соединил я их.

более менее разобрался.
надо было испольозвать LEFT JOIN

так как быть с INSERTом?
для каждой строки можно запустить ?

Это сообщение отредактировал(а) DenWPF - 20.10.2010, 14:01
PM MAIL   Вверх
Akina
Дата 20.10.2010, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(DenWPF @  20.10.2010,  14:42 Найти цитируемый пост)
 как быть с INSERTом?

Здрасьте! я тебе дал 4 запроса, которые надо собрать в один.
Или не собирай - оставь их по отдельности.

Цитата(DenWPF @  20.10.2010,  14:42 Найти цитируемый пост)
надо было испольозвать LEFT JOIN

Нет. Если ты будешь использовать левое соединение, потеряешь новые строки.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DenWPF
Дата 20.10.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ну а через rigth не выходит не чего.
PM MAIL   Вверх
Akina
Дата 20.10.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



 smile А что должно выходить в запросе на добавление записей в таблицу??? я уж даже боюсь спросить "и откуда"...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DenWPF
Дата 20.10.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



при запросе с rigth

на выходе получается таблица, только с теми данными которые есть во 2 таблице.

Код

SELECT q1.a_sum, q2.t_sum, (
q1.a_sum - COALESCE( q2.t_sum, 0 ) 
) AS f_sum
FROM (

SELECT ft.id_Trainer AS id, f.id AS idFinance, CONCAT( p.lastname, ' ', p.name, ' ', p.surname ) AS name_client,
 sp.title AS status_payment, date_payment,
 sum( price ) AS a_sum, fp.title AS form_payment,
 f.comment, p.id AS idPerson
FROM Finance f
INNER JOIN Finance_Trainer ft ON ft.id_Finance = f.id
INNER JOIN Status_Payment sp ON sp.id = f.id_status_payment
INNER JOIN Person p ON p.id = ft.id_Trainer
INNER JOIN Form_Payment fp ON fp.id = f.id_form_payment
WHERE sp.id =2
GROUP BY ft.id_Trainer
) AS q1
RIGHT JOIN (

SELECT id_Person AS id, sum( price ) AS t_sum
FROM Сalculation
GROUP BY id_Person
) AS q2 ON q2.id = q1.idPerson



а если через left то данные достаются как мне нужно.
не могу понять где ты говоришь "потеряешь новые строки." - где?

Это сообщение отредактировал(а) DenWPF - 20.10.2010, 15:11
PM MAIL   Вверх
Akina
Дата 20.10.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Блин, я запутался в этой твоей лабуде... теперь вроде распутался.
Код

mysql> create table account(
    -> pkey integer auto_increment primary key,
    -> id integer,
    -> `sum` integer
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> create table turnover(
    -> pkey integer auto_increment primary key,
    -> id integer,
    -> `sum` integer
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into turnover(id,`sum`) values (1,200),(2,200),(1,100),(2,400);
Query OK, 4 rows affected (0.56 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into account(id,`sum`) values (1,300),(2,600),(1,600),(3,400),(3,300),(4,100);
Query OK, 6 rows affected (1.92 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from turnover; select id,sum(`sum`) from turnover group by id;
+------+------+------+
| pkey | id   | sum  |
+------+------+------+
|    1 |    1 |  200 |
|    2 |    2 |  200 |
|    3 |    1 |  100 |
|    4 |    2 |  400 |
+------+------+------+
4 rows in set (0.00 sec)

+------+------------+
| id   | sum(`sum`) |
+------+------------+
|    1 |        300 |
|    2 |        600 |
+------+------------+
2 rows in set (0.00 sec)

mysql> select * from account; select id,sum(`sum`) from account group by id;
+------+------+------+
| pkey | id   | sum  |
+------+------+------+
|    1 |    1 |  300 |
|    2 |    2 |  600 |
|    3 |    1 |  600 |
|    4 |    3 |  400 |
|    5 |    3 |  300 |
|    6 |    4 |  100 |
+------+------+------+
6 rows in set (0.00 sec)

+------+------------+
| id   | sum(`sum`) |
+------+------------+
|    1 |        900 |
|    2 |        600 |
|    3 |        700 |
|    4 |        100 |
+------+------------+
4 rows in set (0.00 sec)

mysql> create view q1
    -> as
    -> SELECT account.id, Sum(account.sum) AS a_sum
    -> FROM account
    -> GROUP BY account.id;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from q1;
+------+-------+
| id   | a_sum |
+------+-------+
|    1 |   900 |
|    2 |   600 |
|    3 |   700 |
|    4 |   100 |
+------+-------+
4 rows in set (0.00 sec)

mysql> create view q2
    -> as
    -> SELECT turnover.id, Sum(turnover.sum) AS t_sum
    -> FROM turnover
    -> GROUP BY turnover.id;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from q2;
+------+-------+
| id   | t_sum |
+------+-------+
|    1 |   300 |
|    2 |   600 |
+------+-------+
2 rows in set (0.00 sec)

mysql> create view q3
    -> as
    -> SELECT q1.id,(q1.a_sum-COALESCE(q2.t_sum,0)) AS f_sum
    -> FROM q1 LEFT JOIN q2 ON q1.id=q2.id
    -> WHERE (q1.a_sum-COALESCE(q2.t_sum,0)) >= 500;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from q3;
+------+-------+
| id   | f_sum |
+------+-------+
|    1 |   600 |
|    3 |   700 |
+------+-------+
2 rows in set (0.01 sec)

mysql> INSERT INTO turnover ( id, `sum` )
    -> SELECT q3.id, q3.f_sum
    -> FROM q3;
Query OK, 2 rows affected (0.13 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from account; select id,sum(`sum`) from account group by id;
+------+------+------+
| pkey | id   | sum  |
+------+------+------+
|    1 |    1 |  300 |
|    2 |    2 |  600 |
|    3 |    1 |  600 |
|    4 |    3 |  400 |
|    5 |    3 |  300 |
|    6 |    4 |  100 |
+------+------+------+
6 rows in set (0.00 sec)

+------+------------+
| id   | sum(`sum`) |
+------+------------+
|    1 |        900 |
|    2 |        600 |
|    3 |        700 |
|    4 |        100 |
+------+------------+
4 rows in set (0.00 sec)

mysql> select * from turnover; select id,sum(`sum`) from turnover group by id;
+------+------+------+
| pkey | id   | sum  |
+------+------+------+
|    1 |    1 |  200 |
|    2 |    2 |  200 |
|    3 |    1 |  100 |
|    4 |    2 |  400 |
|    5 |    1 |  600 |
|    6 |    3 |  700 |
+------+------+------+
6 rows in set (0.00 sec)

+------+------------+
| id   | sum(`sum`) |
+------+------------+
|    1 |        900 |
|    2 |        600 |
|    3 |        700 |
+------+------------+
3 rows in set (0.00 sec)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0928 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.