Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SQL запрос

Автор: MagistrAnatol
Дата сообщения: 20.12.2006 16:32
есть две базы - мастер
CREATE TABLE OtpyckMaster (
FIO VARCHAR(70),
Zex VARCHAR(50),
Kategoriya VARCHAR(40),
Pocada VARCHAR(40),
Oklad FLOAT,
TabN INTEGER,
Ymobu VARCHAR(10),
DniOcn INTEGER,
DniDop INTEGER,
DniSkid INTEGER,
DniMateri INTEGER,
DniInshi INTEGER,
DniAll INTEGER,
DataVuxoda DATE,
Id AUTOINC,
INDEX FIO_ASC (FIO),
INDEX FIO_DESC (FIO DESC)
);
и детал

CREATE TABLE OtpyckFakt (
God INTEGER,
DataNOcn DATE,
DataKOcn DATE,
DniOcn INTEGER,
DniDop INTEGER,
DniSkid INTEGER,
DniMateri INTEGER,
DniInshi INTEGER,
DniAll INTEGER,
DataNAll DATE,
DataKAll DATE,
MasterId INTEGER,
Id AUTOINC
);
ето базы для работы с отпусками - задача такая - надо выбрать всех сотрудников
которые в ,к примеру, 2006 году,поле OtpyckFakt .God,или за период, вообще не были в отпуску,или в которых кол-во дней фактического отпуска OtpyckFakt .DniAll меньше необходимых OtpyckMaster .DniAll.
Я состряпал такой запрос
SELECT OtpyckMaster.FIO,OtpyckFakt.God,OtpyckMaster.DniAll DniM,
OtpyckFakt.DniAll DniF,OtpyckMaster.DniAll-OtpyckFakt.DniAll DniR
FROM OtpyckMaster,OtpyckFakt
WHERE (OtpyckFakt.God NOT IN(2007) OR DniR>0) AND (OtpyckFakt.MasterId=OtpyckMaster.Id)
ORDER BY FIO;
но он выбирает токо тех работников у которых было движение по отпусках в таблице
OtpyckFakt , без строки (OtpyckFakt.MasterId=OtpyckMaster.Id) выбирает вообще все
Всем заранее благодарен за помощь
Автор: Mickey_from_nsk
Дата сообщения: 22.12.2006 12:49
Для соединения таблиц с возможным отсутствием в одной из них ключевого поля используется не просто join, а outer join.в твоем случае будет примерно так

Код:
SELECT OtpyckMaster.FIO,OtpyckFakt.God,OtpyckMaster.DniAll DniM,
OtpyckFakt.DniAll DniF,OtpyckMaster.DniAll-OtpyckFakt.DniAll DniR
FROM OtpyckMaster m left outer join OtpyckFakt f on (OtpyckFakt.MasterId=OtpyckMaster.Id)
WHERE f.Dni is NULL or f.Dni < m.DniAll
ORDER BY FIO;
Автор: MagistrAnatol
Дата сообщения: 04.01.2007 09:18
Mickey_from_nsk
пасиб получилось
Автор: fat_lucky
Дата сообщения: 04.01.2007 12:55
А еще для создания запросов можно использовать различные билдеры...
Автор: MagistrAnatol
Дата сообщения: 10.01.2007 08:56
fat_lucky
Назви хотябы один - я их никогда не использовал
Автор: leshy84
Дата сообщения: 10.01.2007 09:08
MagistrAnatol
А погуглить не пробовал?
Автор: andead
Дата сообщения: 26.01.2007 23:46
может мне кто поможет, есть табицы:

users
+--------+--------+-----------+
| userid | name | newscount |
+--------+--------+-----------+
| 1 | user1 | 0 |
| 2 | user2 | 0 |
| 3 | user3 | 0 |
+--------+--------+-----------+

news
+--------+--------+-------------+
| newsid | userid | text |
+--------+--------+-------------+
| 1 | 1 | бла бла бла |
| 2 | 1 | бла бла бла |
| 3 | 2 | бла бла бла |
| 4 | 3 | бла бла бла |
+--------+--------+-------------+

можно ли одним запросам сделать чтобы в таблице users.newscount было записано
кол-во новостей которые написал каждый юзер, т.е чтобы стало:
+-----------+
| newscount |
+-----------+
| 2 |
| 1 |
| 1 |
+-----------+
Автор: Jokerjar
Дата сообщения: 26.01.2007 23:57
andead, думаю нужно написать скрипт на PHP, который бы это делал
Автор: andead
Дата сообщения: 27.01.2007 07:24
срипт то написан, с циклом, хотелось бы одним запросом если такое возможно
Автор: rain87
Дата сообщения: 27.01.2007 13:50
andead
SELECT COUNT(news.newsid) AS newscount FROM news GROUP BY news.userid
выдаст, по идее
Цитата:
+-----------+
| newscount |
+--------+
|         2 |
|         1 |
|         1 |
+--------+

Автор: andead
Дата сообщения: 27.01.2007 14:17
выдаст он выдаст, мне нада UPDATE всех записей сделать с ноликов на эти значения

Добавлено:
может есть у кого сборник "крутых" примеров по SQL, запросы с подзапросами и т.д?
Автор: A_V
Дата сообщения: 27.01.2007 15:23
andead
update users set newscount =
(
select count(n.userid) from news n
where n.userid = users.userid
)
Автор: andead
Дата сообщения: 27.01.2007 17:53
A_V
поклон в ноги писал похожее но не знал как в подзапросе узнать текущий userid
where n.userid = users.userid всё просто оказалось, мерси!
Автор: Portfel
Дата сообщения: 22.06.2007 17:24
Тоже вопрос про запрос...


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

то есть я запросом выбрал из базы данные, получилось нечно

1 2 3
1 X Z W

2 D R T

3 Y U U

Как тут сменить W на нужное мне значение?
А то я в "командах" суфиксах и знаках не очень силен в sql.

Спасибо.
Автор: Cosmo_vk
Дата сообщения: 23.06.2007 19:38
Portfel

Цитата:

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

use твоя_таблица
set имя_колонки = w
where тут пишем твои условия.
а у меня есть пожелание все-таки конкретизировать вопрос.
Автор: Portfel
Дата сообщения: 25.06.2007 08:03
Cosmo_vk

ну смотри, вот запрос

SELECT a.p_code, a.p_value
FROM parameters a

выдает табличку
ROW P_CODE P_VALUE
1 105 <дата>
2 103 <дата>
3 101 <дата>
4 106 <дата>
5 102 <дата>
6 201 <дата>


Надо поменять в базе дату во втором ряду...(p_value которая)

Use parameters a
set p_value = <новая дата>
where a.p_code like 103

???
так шоль?
А то еще чего -нить не "то" махну )
Автор: reflexfx
Дата сообщения: 25.06.2007 08:23
use <база данных> !!! а не имя таблицы
а теперь применимо к написанному
update parameters set p_value = <new_date> where p_code=103
или с алиасами
update parameters a set a.p_value = <new_date> where a.p_code=103


Автор: Portfel
Дата сообщения: 25.06.2007 08:27
reflexfx
А что значит
Цитата:
или с алиасами
???
Меня всегда интересовало, почему в пишется (у нас по крайней мере) parameters a
и соответсвенно все столбцы не p_code, а a.p_code ???
Что за "а" ?
Еще раз спасибо.
Автор: reflexfx
Дата сообщения: 25.06.2007 09:26
Алиас это всего лишь псевдоним таблицы
Автор: Portfel
Дата сообщения: 25.06.2007 10:08
reflexfx
а чего "оно" без псевдонима не делает? )))
Да и все таки смысл не увловил. Зачем этот "псевдоним"?

а еще если
Цитата:
update parameters a set a.p_value = <new_date> where a.p_code=103

что надо вписать вместо <new_date> чтоб получилось сегодняшнее число.Потому как вставив тупо 25.06.2007 не канает...пишет что "SQL command not properly ended"

Добавлено:
все сорь.."кавычки" то Вы забыли написать, ай ай ай...подставили меня )))))))))))))))))
Спасибо большое!!!!
Автор: reflexfx
Дата сообщения: 25.06.2007 11:29

Цитата:
Да и все таки смысл не увловил. Зачем этот "псевдоним"?

в сложном запросе где одна и таже таблица учавствует несколько раз без алиаса не обойтись и ктому же количество писанины уменьшается при длинных названиях
Автор: latin
Дата сообщения: 06.02.2008 22:53
Господа, подскажите, как составить вот такой запрос.
Исходные данные:
Есть таблица <i>таблица1</i> и в ней столбцы <i>поле1</i>, <i>поле2</i>, ...<i>полеN</i>. Необходимо сделать выборку удовлетворяющую следующим условиям - подсчитать количество записей в <i>поле2</i> которые соответствуют, например, значениям 1 и 2, а так же подсчитать количество записей которые не равны этим значениям. Результат вывести сгруппированным по <i>поле1</i>. Просто подсчитать количество записей по какому то одному условию у меня получилось вот таким запросом: <i>Select поле1, COUNT(поле2) AS Условие1, COUNT(поле2) AS Условие2 from таблица1 WHERE поле2 <>1 and поле2 <>2 group by поле1</i>, а как сделать чтобы отбор производился по обоим условиям? Я пробовал и объединять несколько запросов и делать вложенные запросы, но результатов это не давало. Скорее всего я не правильно строил эти запросы.
Я не очень хорошо разбираюсь в этом вопросе так что если возможно, то с примером и по подробнее.
Автор: AndVGri
Дата сообщения: 07.02.2008 15:16
latin

Код:
Select p.Field1, p.With12, s.Not12 From
(Select Field1, Count(Field2) As With12 From Table1
Where Field2 In (1, 2) Group By Field1) As p
Inner Join
(Select Field1, Count(Field2) As Not12 From Table1
Where Field2 Not In (1, 2) Group By Field1) As s
On p.Field1 = s.Field1;
Автор: latin
Дата сообщения: 09.02.2008 16:44
AndVGri

Спасибо за подсказку, все получилось, у меня тоже база в формате Access. Только вместо Inner Join использовал Left Join т.к. количество записей различается.
Автор: AndVGri
Дата сообщения: 09.02.2008 16:51
latin

Цитата:
количество записей различается

Тогда лучше

Код:
Select MT.Field1, p.With12, s.Not12 From
((Select Field1 From Table1 Group By Field1) As MT Left Join
(Select Field1, Count(Field2) As With12 From Table1
Where Field2 In (1, 2) Group By Field1) As p
On MT.Field1 = p.Field1) Left Join
(Select Field1, Count(Field2) As Not12 From Table1
Where Field2 Not In (1, 2) Group By Field1) As s
On MT.Field1 = s.Field1;
Автор: needDrivers
Дата сообщения: 18.03.2008 10:26
Помогите оптимизировать MySQL запрос!

Код: Таблица 1. Список городов. (cc)
code - Идентификатор
name - Название города

Таблица 2. Запросы пользователей. (ur)
id
date
src - Идентификатор города из тбл. 1.
dst - Идентификатор города из тбл. 1.
Автор: dmka
Дата сообщения: 18.03.2008 11:18

Цитата:
Как можно оптимизировать?

Можно индексы построить по src и dst. Если у тебя для web-а используется, то имеет смысл закэшировать результат на какое-то время и не дергать sql на каждой странице.
Автор: needDrivers
Дата сообщения: 18.03.2008 19:25
Индексы давно созданы.
Да, наверное всё-таки придётся делать временную таблицу.
Автор: Sanyaaa
Дата сообщения: 11.04.2008 10:20
подскажите уважаемые, есть запрос к Oracle

SELECT SUM (таблица.поле2деньги) allias2
FROM схема.таблица
WHERE ( (таблица.поле3индентификатор = 'QQQ')
AND (таблица.datet <= '01.01.2008')
)
GROUP BY таблица.поле1

Выводит табличку (, сгруппированная по полю1, сумма из поля деньги, при условии что поле3=QQQ, поле дата <= '01.01.2008')


+--------+
| allias2|
+--------+
| 4534 |
| 3538 |
| 1563 |
| 4231 |
+--------+

Как бы сформировать запрос, чтобы добавить условие таблица.datet <= '01.01.2007' и вывести в столбец рядом с allias2?

+--------++--------+
| allias2|| allias3|
+--------++--------+
| 4534 || 2331 |
| 3538 || 9335 |
| 1563 || 3622 |
| 4231 || 7564 |
+--------++--------+


Т.е. грубо говоря
SELECT SUM (таблица.поле2деньги) allias2
FROM схема.таблица
WHERE ( (таблица.поле3индентификатор = 'QQQ')
AND (таблица.datet <= '01.01.2008')
)
GROUP BY таблица.поле1
и такой же запрос, но при условии таблица.datet <= '01.01.2008' - вывести в колонку рядом
Автор: AndVGri
Дата сообщения: 12.04.2008 03:24
Sanyaaa
Объединённый
Select f.alias1, s.alias2 From
(SELECT таблица.поле1, SUM (таблица.поле2деньги) allias1
FROM схема.таблица
WHERE ((таблица.поле3индентификатор = 'QQQ')
AND (таблица.datet <= '01.01.2008'))
GROUP BY таблица.поле1) f,
(SELECT таблица.поле1, SUM (таблица.поле2деньги) allias2
FROM схема.таблица
WHERE ((таблица.поле3индентификатор = 'QQQ')
AND (таблица.datet <= '01.01.2007'))
GROUP BY таблица.поле1) s
Where f.поле1 = s.поле1

Страницы: 1234567891011121314

Предыдущая тема: Строковый параметр в REG_BINARY


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.