SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.03.2016 18:48:59

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Подскажите как написать запрос

Добрый день!
Помогите с запросом,
Хочу получить значение кол-ва распечатанных копий(Сумму по каждому принтеру) из таблицы print c такой даты по такую,
Пример:
Выбираем дату с 2016-02-18 по 2016-02-19, выбираем блок, (например `Розничный_бизнес`) и поле Count получаем количество отпечатков, т.е. от Count за 2016-02-19 отнимает значение Count за 2016-02-18. Даты могут выбираться с разным интервалом времени.
Знания заканчиваются на этом месте:


select  Model,Block,Unit,Xnumber,sum(Count) where Dprint beetwin '2016-02-18' and '2016-02-19';    
 

Как правильно написать?

Отредактированно Tera2017 (09.03.2016 19:03:40)


Прикрепленные файлы:
Attachment Icon print.txt, Размер: 14,477 байт, Скачано: 721

Неактивен

 

#2 09.03.2016 19:14:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите как написать запрос

Попробуйте

select count(*),Model from TABLENAME where  Dprint between '2016-02-18' and '2016-02-19' GROUP BY Model;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 09.03.2016 19:19:59

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

хочу понять запрос select count(*) -все значения по полу count а где разность? между датами? Или я что не понимаю?

Неактивен

 

#4 09.03.2016 19:21:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите как написать запрос

так выбиралась не разница между датами, именно те распечатки, которые были в период между '2016-02-18' and '2016-02-19'.

Если это не то, то приведите маленький пример выборки результирующей, которую Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 09.03.2016 19:27:30

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

Нужно выбрать Начальную дату и конечную и получить разность по полу Count. Это и будут кол-во отпечатков за сутки. Даты могут быть произвольные. Объяснил как смог smile

Неактивен

 

#6 09.03.2016 19:36:41

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос


Model                    Block                    Unit                    Xnumber        Dprint        Snumber     Count    
Xerox_Phaser_3610    Розничный_бизнес    ККО_Академический    0930070097    2016-02-18           3150872978      55850

Model                    Block                    Unit                    Xnumber        Dprint        Snumber     Count    
Xerox_Phaser_3610    Розничный_бизнес    ККО_Академический    0930070097    2016-02-19           3150872978      55855
Хочу получить:
Model                    Block                    Unit                    Xnumber          Snumber            Count    
Xerox_Phaser_3610    Розничный_бизнес    ККО_Академический    0930070097      3150872978               5

.........
 

Отредактированно Tera2017 (09.03.2016 19:37:30)

Неактивен

 

#7 10.03.2016 14:50:29

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

Ребята, есть какие-либо соображения, дайте подсказку

Неактивен

 

#8 10.03.2016 15:59:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите как написать запрос

Давайте несколько упростим для начала.
Вот есть у нас таблица t
в которой есть модель (model), дата распечатки (dt)
model        dt
epson        2016-01-01
epson        2016-01-01
epson        2016-01-02
xerox         2016-01-01
xerox         2016-01-02

Какой результат Вы хотите получить в запросе?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 10.03.2016 16:44:36

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

model        dt                   kol-vo                     
hp             2016-01-01        5
epson        2016-01-01        5
epson        2016-01-02        6
xerox         2016-01-01       1
xerox         2016-01-02       20

Хочу получить. Находим значение c даты 2016-01-02 по 2016-01-02 т.е. Значение кол-во за  2016-01-02 отнимается значение кол-ва 2016-01-01. Как-то так...

model            kol-vo                     
hp                    5
epson               1
xerox              19

Неактивен

 

#10 10.03.2016 18:45:35

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите как написать запрос

Рекомендую все же получить через sql значения kol-vo за конкретные даты, а вычитанием заниматься уже на стороне клиента.

SELECT sum(`kol_vo`),`model` FROM `t` GROUP BY `model` ORDER BY `dt`;

Ну или можно хранимую процедуру написать, компромиссное решение.
Или это лабораторная работа и преподаватель примет результат только в виде sql-запроса?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 10.03.2016 18:57:50

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

Данный запрос я хочу использовать для написания поиска для php

Неактивен

 

#12 10.03.2016 19:12:46

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

не верно получается нужно от старшей даты отнимать младшую  а здесь считается сумма, это не то. Нужно находить кол-во отпечатков за определенный промежуток в целом.

Неактивен

 

#13 10.03.2016 19:33:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Подскажите как написать запрос

Сколько данных даёте, то и получается... Я ж не знаю от какой даты нужно какую дату отнимать. Может уже опишете свою задачу действительно понятно ;-) ?

Судя по всему каждый день каждое печатающее устройство печатает сколько-то листов, так?
Что же Вы хотите получить в итоге?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 10.03.2016 19:43:51

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

да, каждый день, собираются счетчики по все устройствам и записываются в табличку файл с табличкой выше, выбираюся две даты начальная и конечная дата и от конечной отнимается значение счетчика начальной? Так понятно?


IDprint    Model            Block            Unit            Xnumber        Dprint        Snumber        Count    IPaddress
1    Xerox_Phaser_3610    Розничный_бизнес    ККО_Академический    0930070097    2016-02-18    3150872978    55850    172.31.11.139
2    Xerox_WorkCentre_3220    Розничный_бизнес    ККО_Академический    0930070119    2016-02-18    3221862944    80769    172.31.11.134
3    Xerox_WorkCentre_3325    Розничный_бизнес    ККО_Академический    0930070131    2016-02-18    3259926938    31339    172.31.11.141
4    Xerox_WorkCentre_3325    Розничный_бизнес    ККО_Академический    0930070130    2016-02-18    3259944090    11755    172.31.11.140
5    HP_LaserJet_3052n    Розничный_бизнес    ККО_Академический    0930070075    2016-02-18    CNSKM73353    234204    172.31.11.142
6    Xerox_WorkCentre_3325    Розничный_бизнес    ККО_Омск-Тополиный    0930070138    2016-02-18    3259959348    2656    172.31.56.76
7    HP_LaserJet_600_M602x    Розничный_бизнес    ККО_Омск-Тополиный    0930070022    2016-02-18    CNBVDB9037    370816    172.31.56.75
8    HP_LaserJet_M1536dnf    Розничный_бизнес    ККО_Омск-Тополиный    0930070026    2016-02-18    CNC9CDNB11    89916    172.31.56.72
9    HP_LaserJet_M1536dnf    Розничный_бизнес    ККО_Омск-Тополиный    0930070028    2016-02-18    CNC9CDVBQH    117594    172.31.56.74
10    HP_LaserJet_M1536dnf    Розничный_бизнес    ККО_Омск-Тополиный    0930070025    2016-02-18    CNC9CDVBQK    36183    172.31.56.73
11    Xerox_Phaser_3610    Розничный_бизнес    ККО_Омск-Успенский    0930070100    2016-02-18    3150953129    12976    172.31.44.132
12    Xerox_WorkCentre_3550    Розничный_бизнес    ККО_Омск-Успенский    0930070002    2016-02-18    3257035165    281356    172.31.44.134
13    Xerox_WorkCentre_3325    Розничный_бизнес    ККО_Омск-Успенский    0930070094    2016-02-18    3259897512    4548    172.31.44.133
14    Xerox_WorkCentre_3325    Розничный_бизнес    ККО_Омск-Успенский    0930070095    2016-02-18    3259897881    29607    172.31.44.136
15    HP_LaserJet_M1536dnf_MFPРозничный_бизнес    ККО_Омск-Успенский    0930070005    2016-02-18    CNC9CDTCVV
 


Count это счетчик, который я хочу получать т.е разность двух значений за две даты

Неактивен

 

#15 10.03.2016 19:44:30

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

Вроде все понятно, объяснил?

Неактивен

 

#16 10.03.2016 20:02:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подскажите как написать запрос

SELECT (SELECT `Count` FROM t WHERE Dprint = '2016-02-19') - (SELECT `Count` FROM t WHERE Dprint = '2016-02-18');


Я правильно понимаю, что Вы хотите вот это?

Если да, то с группировкой, видимо, вот так:

SELECT t1.`Count` - t2.`Count`, t1.SNumber
FROM t AS t1, t AS t2
WHERE t1.Snumber = t2.Snumber AND t1.Dprint = '2016-02-19' AND t2.Dprint = '2016-02-18'
GROUP BY t1.Snumber

Неактивен

 

#17 11.03.2016 07:02:02

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

Данный запрос мне необходим чтобы извлекать данные с формы.
Ошибка синтаксиса:


mysql> SELECT (SELECT `Count` FROM print WHERE Dprint = '2016-02-19') - (SELECT `Count` FROM print WHERE Dprint = '2016-02-18');
ERROR 1242 (21000): Subquery returns more than 1 row
 


а во втором запросе все храниться в одной таблице, а на примере я так понял две таблицы, как в этом случаи будет выглядеть запрос? Структура таблицы ниже:

create database allprint;  
CHARACTER SET 'utf8'
COLLATE 'utf8';
use allprint;
create table print(
IDprint INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Model VARCHAR(100) NOT NULL,
Block VARCHAR(100) NOT NULL,
Unit VARCHAR(80) NOT NULL,
Xnumber VARCHAR(80) NOT NULL,
Dprint DATE NOT NULL,
Snumber VARCHAR(80) NOT NULL,
Count INT NOT NULL,
IPaddress VARCHAR(80) NOT NULL
)
ENGINE=INNODB;

 

Отредактированно Tera2017 (11.03.2016 07:24:26)


Прикрепленные файлы:
Attachment Icon поиск.jpg, Размер: 27,717 байт, Скачано: 363

Неактивен

 

#18 11.03.2016 11:32:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подскажите как написать запрос

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

SELECT t1.`Count` - t2.`Count`, t1.SNumber
FROM print AS t1, print AS t2
WHERE t1.Snumber = t2.Snumber AND t1.Dprint = '2016-02-19' AND t2.Dprint = '2016-02-18'
GROUP BY t1.Snumber

Нужны индексы на (Dprint) и на (Snumber, Dprint).

Неактивен

 

#19 11.03.2016 14:23:39

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

SELECT t1.Block AS 'Блок',t1.Unit AS 'Подразделение',t1.Xnumber AS 'Номер Xerox',t1.Model AS 'Модель',t1.SNumber AS 'Серийный номер',t1.`Count` - t2.`Count` AS 'Итого'
FROM print AS t1, print AS t2
WHERE t1.Block = t2.Block and t1.Unit = t2.Unit and t1.Xnumber=t2.Xnumber and t1.Model=t2.Model and t1.Snumber = t2.Snumber AND t1.Dprint = '2016-03-11' AND t2.Dprint = '2016-02-18'
GROUP BY t1.Xnumber;

Неактивен

 

#20 11.03.2016 14:37:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подскажите как написать запрос

У Вас могут быть устройства с одинаковым серийником в разных подразделениях?

Неактивен

 

#21 11.03.2016 15:39:45

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

нет серийники уникальные у каждого аппарата

Неактивен

 

#22 11.03.2016 15:42:21

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

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


SELECT t1.Block AS 'Блок',t1.Unit AS 'Подразделение',t1.Xnumber AS 'Номер Xerox',t1.Model AS 'Модель',t1.SNumber AS 'Серийный номер',t1.`Count` - t2.`Count` AS 'Итого'
FROM print AS t1, print AS t2
WHERE t1.Block = t2.Block and t1.Unit = t2.Unit and t1.Xnumber=t2.Xnumber and t1.Model=t2.Model and t1.Snumber = t2.Snumber AND t1.Dprint = '2016-03-11' AND t2.Dprint = '2016-02-18'
GROUP BY t1.Block,t1.Unit,t1.Xnumber;

 

Неактивен

 

#23 11.03.2016 17:56:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подскажите как написать запрос

Вы хотите именно сгруппировать или отсортировать по ним?

Неактивен

 

#24 11.03.2016 19:14:55

Tera2017
Завсегдатай
Зарегистрирован: 08.02.2016
Сообщений: 58

Re: Подскажите как написать запрос

сгруппировать

Неактивен

 

#25 11.03.2016 20:26:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подскажите как написать запрос

SELECT t1.Block AS 'Блок',t1.Unit AS 'Подразделение',t1.Xnumber AS 'Номер Xerox',t1.Model AS 'Модель',t1.SNumber AS 'Серийный номер',SUM(t1.`Count`) - SUM(t2.`Count`) AS 'Итого'
FROM print AS t1, print AS t2
WHERE t1.Block = t2.Block and t1.Unit = t2.Unit and t1.Xnumber=t2.Xnumber and t1.Model=t2.Model and t1.Snumber = t2.Snumber AND t1.Dprint = '2016-03-11' AND t2.Dprint = '2016-02-18'
GROUP BY t1.Block,t1.Unit,t1.Xnumber;


Так?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson