Topic: Вычисляемое поле

Подскажите, как одним выражением в вычисляемом поле заполнить сразу две ячейки для id=1 и для id=2?

(
SELECT
//формула для id=1
(SELECT COUNT(DISTINCT id_Baza) FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0), IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0), IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0), IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0), IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма
)WHERE StatGlav.id=1

//Что здесь должно быть, чтобы запрос работал???

//Формула для id=2
(SELECT COUNT(DISTINCT id_Baza) FROM BazaIzmereni
)- (
SELECT COUNT(DISTINCT id_Baza) FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0), IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0), IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0), IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0), IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма
) WHERE StatGlav.id=2
)

Выражение для id=1 работает отлично, клеточка заполняется, а вот как этим же запросом заполнить клеточку для id=2 ума не приложу.

2 (edited by Vitaly 2016-03-28 17:25:20)

Re: Вычисляемое поле

Внес поправки, должно работать, но выскакивает ошибка:

only a single result allowed for a SELECT that is part of an expression

Получается что нельзя иметь два значения одному полю (хоть и для разных строк).
Дмитрий, тогда как можно в отчете создать круговую диаграмму? Для нее нужна таблица как в мануале к FastReport. Но сложность в том, что для поля "Страна", поле "Площадь территории" у меня является вычисляемым.
П.С, Я так понял надо скриптом из таблицы показывающей значения нужных мне вычисляемых полей вытащить данные и записать в таблицу.

procedure NastroikiStat_OnShow (Sender: string; Action: string);
begin
NastroikiStat.TableGrid1.Cells[1,0]:= Form1.TableGrid2.Cells[10,0];
NastroikiStat.TableGrid1.Cells[1,1]:= Form1.TableGrid2.Cells[11,0];
end;

Вот так я из ячейки в ячейку перетаскиваю. Подскажите как сохранить данные.

Re: Вычисляемое поле

Переделал... что-то не получается.

procedure NastroikiStat_OnShow (Sender: string; Action: string);
begin
 SQLExecute('insert into StatGlav (id,"Наименование показателя",Количество)  VALUES(1,"Количество дефектного оорудования",'+Form1.TableGrid2.Cells[10,0]+')');
  SQLExecute('insert into StatGlav (id,"Наименование показателя",Количество)  VALUES(2,"Количество нормального оорудования",'+Form1.TableGrid2.Cells[11,0]+')');
end;

Последовательно вылетают два сообщения что я что-то уникальное сломал, а запись происходит только для id=1  sad

4 (edited by iacovlogica 2016-03-28 21:24:22)

Re: Вычисляемое поле

Вы пытаетесь присвоить  id  значение 1 и 2
....id если создан программой то имеет AUTO_INCREMENT , то есть ему  нельзя ничего присваивать.
id SQL сам сгенерирует новый и уникальный.
Если Вам надо что то поменять в записи то надо использовать оператор UPDATE

http://www.sql-tutorial.ru/ru/book_upda … ement.html
http://www.mysql.ru/docs/man/UPDATE.html

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

Re: Вычисляемое поле

Vitaly
Вычисляемые поля вы можете добавлять в отчет точно также как и обычные поля, пожалуйста приложите ваш тестовый проект, постараюсь помочь.

Dmitry.

Re: Вычисляемое поле

iacovlogica wrote:

Вы пытаетесь присвоить  id  значение 1 и 2
....id если создан программой то имеет AUTO_INCREMENT , то есть ему  нельзя ничего присваивать.
id SQL сам сгенерирует новый и уникальный.
Если Вам надо что то поменять в записи то надо использовать оператор UPDATE

http://www.sql-tutorial.ru/ru/book_upda … ement.html
http://www.mysql.ru/docs/man/UPDATE.html

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

Огромное спасибо за объяснение и ссылки! Сутки в пустую потратил, а оказывается все так просто!

procedure NastroikiStat_OnShow (Sender: string; Action: string);
begin
SQLExecute('UPDATE StatGlav SET Количество='+Form1.TableGrid2.Cells[10,0]+' WHERE StatGlav.id=1 ');
SQLExecute('UPDATE StatGlav SET Количество='+Form1.TableGrid2.Cells[11,0]+' WHERE StatGlav.id=2 ');
end;

По поводу кавычек. Русский язык воспринимает нормально без кавычек при условии, что нет пробелов, иначе ругается.

7 (edited by Vitaly 2016-03-29 07:56:50)

Re: Вычисляемое поле

DriveSoft wrote:

Vitaly
Вычисляемые поля вы можете добавлять в отчет точно также как и обычные поля, пожалуйста приложите ваш тестовый проект, постараюсь помочь.

Создал тестовый проект, наполнил тестовыми данными. Покажите пожалуйста, как на основе вычисляемых полей в таблице BazaIzmereni создать круговую диаграмму процентного соотношения нормального и дефектного оборудования.

Post's attachments

Attachment icon Diagram.rar 5.3 kb, 429 downloads since 2016-03-29 

Re: Вычисляемое поле

Vitaly
Готово.
Для того чтобы в графике были видны процентные соотношения, необходимо зайти в настройки графика (Pie)
Marks > Style и выбрать значение smsLabelPercent

Post's attachments

Attachment icon Diagram_fixed.zip 8.42 kb, 434 downloads since 2016-03-30 

Dmitry.

Re: Вычисляемое поле

Дмитрий, бесконечное вам спасибо! Сам бы не догадался так запрос написать. Вы мне очень помогли!

Re: Вычисляемое поле

Дмитрий, подскажите пожалуйста. Вот есть запрос:

SELECT Value, ValueName, Valu, ValuName
FROM
(SELECT COUNT(DISTINCT id_Baza) as Value,
"С дефектами" as ValueName
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0), 
IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0), 
IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0), 
IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0), 
IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма


UNION ALL


SELECT COUNT(DISTINCT id_Baza) as Value,
"Нормальные" as ValueName
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0), 
IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0), 
IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0), 
IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0), 
IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
<=BazaIzmereni.Норма)

JOIN      

(SELECT COUNT(DISTINCT id_Baza) as Valu,
"Всего" as ValuName
FROM BazaIzmereni

UNION ALL

SELECT COUNT(DISTINCT id_Baza) as Valu,
"С дефектами" as ValuName
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0), 
IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0), 
IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0), 
IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0), 
IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма)

Почему на диаграмме Bar при показе Valu и ValuName  данные дублируются?
http://s8.hostingkartinok.com/uploads/images/2016/03/2bdda8d2c8b990fdd41c0fa8339c0608.jpg

Re: Вычисляемое поле

Получилось декартовое произведение, когда все строки обеих таблиц соответствуют друг другу. Нужно составить условие объединения через оператор WHERE. Голова кипит... составил в репорте эту самую таблицу, перепробовал кучу вариантов фильтрования, но полностью удалить лишнее не получается sad

Re: Вычисляемое поле

Фуух. Вроде решил проблему введя индексы id и idE, проведя по их равенству объединение (хотя тот же результат можно получить путем объединения по их неравенству). Заодно ошибку в вычислениях нашел. Итоговый код такой получился:

SELECT Value, ValueName, Valu, ValuName
FROM
(SELECT COUNT(DISTINCT id_Baza) as Value,
"С дефектами" as ValueName,
"1" as idE
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0),
IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0),
IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0),
IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0),
IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма

UNION

SELECT DISTINCT((SELECT COUNT(DISTINCT id_Baza) FROM BazaIzmereni) - (SELECT COUNT(DISTINCT id_Baza) FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1 and (select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0),
IFNULL("2В",0), IFNULL("2П",0), IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0),
IFNULL("4В",0), IFNULL("4П",0), IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0),
IFNULL("6В",0), IFNULL("6П",0), IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0),
IFNULL("8В",0), IFNULL("8П",0), IFNULL("8О",0))FROM BazaIzmereni Bz  WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма))as Value,
"Нормальные" as ValueName,
"2" as idE
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1 ORDER BY ValueName) as A

JOIN

(SELECT COUNT(DISTINCT id_Baza) as Valu,
"Всего" as ValuName,
"2" as id
FROM BazaIzmereni

UNION

SELECT COUNT(DISTINCT id_Baza) as Valu,
"С дефектами" as ValuName,
"1" as id
FROM BazaIzmereni
WHERE BazaIzmereni.id_TipIzmerenia=1
and
(select MAX(IFNULL("1В",0), IFNULL("1П",0), IFNULL("1О",0), IFNULL("2В",0), IFNULL("2П",0),
IFNULL("2О",0), IFNULL("3В",0), IFNULL("3П",0), IFNULL("3О",0), IFNULL("4В",0), IFNULL("4П",0),
IFNULL("4О",0), IFNULL("5В",0), IFNULL("5П",0), IFNULL("5О",0), IFNULL("6В",0), IFNULL("6П",0),
IFNULL("6О",0), IFNULL("7В",0), IFNULL("7П",0), IFNULL("7О",0), IFNULL("8В",0), IFNULL("8П",0),
IFNULL("8О",0))FROM BazaIzmereni Bz WHERE Bz.id=BazaIzmereni.id)
>BazaIzmereni.Норма ORDER BY ValuName) as B
WHERE id=idE

а диаграмма Bar такая:
http://s8.hostingkartinok.com/uploads/images/2016/03/f6073ede2f3ade112eaf39a55ce00499.jpg

Re: Вычисляемое поле

Я что-то совсем запутался... Извините за глупый вопрос. Как мне к предыдущему коду добавить

select KolIzm
from
(select count(id) as KolIzm from BazaIzmereni)

Всю голову сломал. Хотел через ";" добавить - сообщение об ошибке, добавлял внутрь кода - тоже ругается.
Предыдущий код - таблица, а как в этом же запросе отдельные таблицы создавать? Мне нужно одним запросом вытянуть кучу разнородных данных.

Re: Вычисляемое поле

Извиняюсь за тупость. "JOIN" решает все проблемы.