Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Maurinho da Praia

Arrays em Banco de Dados

Recommended Posts

Dados Mysql;PHP5

_ Preciso de uma media final (CE) que é a média total de cada produto. Veja o toddy: 2,79(maior preço)/2,648(menor preço)=1,054(coef). Depois 2,78/2,648=1,05 ... até 2,65/2,648=1,001. O Coef deste produto é então a soma dos coef dividido pelo numero de ocorrencia, portanto coef=1,0309. Preciso programar de modo a obter o coef final, que chamei de CE (coeficiente de economia) que é a média final das médias de cada produto. Exemplos com arrays unidimensionais deram certo mas dessa forma ainda não consigui. Alguém se dispõe ??? ...

 

 

cod prod preco coef media final por produto

1 ACHOC EM PO TODDY 400g TRAD POTE 2,648 1,054

1 ACHOC EM PO TODDY 400g TRAD POTE 2,650 1,050

1 ACHOC EM PO TODDY 400g TRAD POTE 2,700 1,020

1 ACHOC EM PO TODDY 400g TRAD POTE 2,780 1,001

1 ACHOC EM PO TODDY 400g TRAD POTE 2,790 4,124 1,030966767

 

2 ACUCAR AMOROSO 1Kg REFINADO 1,420 1,021

2 ACUCAR AMOROSO 1Kg REFINADO 1,450 1,021 1,021

 

3 ADOCANTE ZERO CAL 100ML 1,650 1,242

3 ADOCANTE ZERO CAL 100ML 1,710 1,103

3 ADOCANTE ZERO CAL 100ML 1,710 1,036

3 ADOCANTE ZERO CAL 100ML 1,820 1,036

3 ADOCANTE ZERO CAL 100ML 2,050 4,418 1,1045

 

4 AGRIN TOSCANO 750ML BRANCO 0,800 1,050

4 AGRIN TOSCANO 750ML BRANCO 0,840 1,050 1,05

 

5 AGUARD 51 965ML 3,630 1,085

5 AGUARD 51 965ML 3,680 1,030

5 AGUARD 51 965ML 3,740 1,014

5 AGUARD 51 965ML 3,940 3,129 1,043158861

 

1,049925126 = CE = COEF DE ECONOMIA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poste a estrutura dessas tabelas..

Mas a idéia geral, é fazer um SELEC mostrando todos os produtos, pode guardar num array os valores..

 

ai você pega a primeira e a ultima posição desse array(usa um num_rows pra isso), faz a tua divisão para o primeiro 'coeficiente'.

A outra divisão, vai ser decorrente dessa.. ^^

 

Me chamou hein?! faço Matemática http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quer pegar o valor médio de um grupo de ocorrências, não precisa fazer essa manobra toda, basta recuperar o valor na própria query. Este exemplo deve funcionar no MySQL:

 

SELECT AVG(p.preco) as preco_medio
FROM precos p
GROUP BY p.produto;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas então Márcio, ele quer o valor médio de apenas 2 linhas: a primeira e a última. Sendo essas, respectivamente o maior e o menor valor, de tal ocorrência.

Por isso que com apenas SQL não teria como.. ou teria ? :lol:

 

Eu guardaria no array já ordenado, para depois pegar a primeira posição e a última e fazer a média..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Humm, entendi. Acredito que sim, o Oracle por exemplo tem o MIN() e MAX(), não sei se o MySQL tem também com esses nomes.

Com o valor máximo e o mínimo, fica possível obter a média.

Não estou em casa e por isso não é possivel testar uma query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é a melhor forma.. mas poderia ser feito assim:

 

// Descobre o total de registros
$sql = "SELECT COUNT(*) FROM `tabela` WHERE <condicao>";
$resultado = mysql_fetch_row(mysql_query($sql));
$total = $resultado[0];

// Pega o primeiro registro:
$sql = "SELECT `coluna` FROM `tabela` WHERE <condicao> LIMIT 1";
$resultado = mysql_fetch_row(mysql_query($sql));
$valor1 = $resultado[0];

// Pega o último registro:
$sql = "SELECT `coluna` FROM `tabela` WHERE <condicao> LIMIT ".max(($total - 1), 1).", 1";
$resultado = mysql_fetch_row(mysql_query($sql));
$valor2 = $resultado[0];

// Calcula a média
$media = round((($valor1 + $valor2) / 2), 2);
Que tal?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu criaria uma função no próprio banco de dados se o mesmo suportasse...

Te trás certas vantagens!

 

Edit:

Exemplo da função do tiutalk [PostgreSQL]:

CREATE OR REPLACE FUNCTION media(varchar, varchar)
  RETURNS float AS
$BODY$
	DECLARE
		tablename ALIAS FOR $1;
		columnname ALIAS FOR $2;
		a float;
		b float;
		s1 refcursor;
	BEGIN
		open s1 FOR EXECUTE 'select ' || quote_ident(columnname) || ' from ' || quote_ident(tablename);
			FETCH FIRST FROM s1 INTO a;
			FETCH LAST FROM s1 INTO b;
		close s1;
			   return (a+b)/2;
	END;
$BODY$ language plpgsql;

Exemplo de usagem:

create table teste (
	numero float not null
);

create table teste2 (
	numero float not null
);

insert into teste values(2.8, 2.2);
insert into teste2 values(2.6, 2);

SELECT media('teste','numero') UNION SELECT media('teste2','numero') as Medias;

Output:

Medias
2.5
2.3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito simples:

 

select
	produto, 
	( ( MIN(preco) + MAX(preco) ) /2 ) AS media,
	MAX(preco) AS valor_maior,
	MIN(preco) AS valor_menor
from 
	valores
GROUP BY produto;

tabela utiliza usada:

drop table if exists valores;
create table valores
(
	oid int(2) auto_increment not null primary key,
	produto char(20) not null,
	preco decimal(4,2)
)type=innodb;

insert into valores(oid, produto, preco) values 
(NULL, 'bolsa', 10.99),
(NULL, 'calça', 20.00),
(NULL, 'calça', 15.90),
(NULL, 'bolsa', 11.99);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nada q um pouco de vodka nao faça....

(embora eu sinceramente nao tenha entendido esse seu indicador, meu conhecimento de economia limita-se ao mercado financeiro , e tipo..... como se diz a media da media nao diz mta coisa)

 

Se você nao entender o SQL fala q eu explico detalhado.

 

select prod, avg(indicador) ce from

(

select taba.prod prod , (taba.preco/min_taba.min_preco) indicador from taba,

(Select prod , min(preco) min_preco from taba group by prod)min_taba

where

taba.prod = min_taba.prod

AND (taba.preco/min_taba.min_preco) <> 1

) media_indicador

GROUP by prod

 

se você quiser o indicador geral basta retirar o agrupamento

 

Isso nao computa os produtos q soh tiverem uma entrada na base (como eu disse eu nao entendi esse seu indicador) , pra computar tambem q soh tem uma entrada use o SQL abaixo

 

select prod, avg(indicador) ce from

(

select taba.prod prod , (taba.preco/min_taba.min_preco) indicador from taba,

(Select prod , min(preco) min_preco ,count(prod) qtde from taba group by prod)min_taba

where

taba.prod = min_taba.prod

AND ( (taba.preco/min_taba.min_preco) <> 1 OR min_taba.qtde = 1 )

) media_indicador

GROUP by prod

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.