Arxiv

Posts Tagged ‘sum()’

Sütunda olan qiymətlərin hasilinin tapılması

Maraqlı bir tapşırıq verilmişdi MySQL User Group-da. Aktiv community faydalı üsullar kəşf edə bildi.
O üsulları və bəzi əlavələri də qeyd etməklə ümumiləşdirib yazıram.
Tapşırıq bundan ibarət idi:
`~ Deyək ki, sales cədvəlində sales_id-nin qiymətləri var. hamısı integer olan bu qiymətlərin hasilini tapmaq lazımdır. Yəni sales_id-nin bütün data-larını bir-birinə vurmalıyıq. Asanlıq üçün sütundakı bütün data-ları yox 3 id-nin hasilini tapacıq. Eyni qayda bütün data-lara da şamil olunur~`

1-ci üsul Procedure. Kamil İbadovFarida Asadova tərəfindən irəli sürülmüş təklif əsasında. Tamamilə işləkdir.:

DELIMITER $$

CREATE PROCEDURE `hasil`()
BEGIN
     declare hasil bigint;
     declare eded int;
     declare v_last_row_fetched int;

     declare cursor1 cursor for
     select sales_id from sales where sales_id in(23,24,25);

     declare continue handler for not found set v_last_row_fetched=1;
       set hasil=1;
       set v_last_row_fetched=0;
       open cursor1;
            cursor_loop: loop
            fetch cursor1 into eded;
                 if v_last_row_fetched=1 then
                      leave cursor_loop;
                 end if;

                 set hasil=eded*hasil;
                 end loop cursor_loop;
     close cursor1;
     select hasil from dual;
     set v_last_row_fetched=0;

END$$

2-ci üsul Elşad Ağayev tərəfindən yazılıb:

set @var = 1;
select max(t.hasil) from 
(SELECT (@var := @var * sales_id) as hasil 
FROM sales where sales_id in(23,24,25)) as t;

3-cü üsul mənim tərəfimdən irəli sürülüb:

select exp(sum(log(sales_id))) from sales where sales_id in (23,24,25);

4-cü üsul da mənim tərəfimdən irəli sürülüb bu dünənki müzakirədə deyilmədi lakin son anda kəşf olundu:

select POW(2,SUM(LOG(2,sales_id))) from sales where sales_id in(23,24,25);

Təşəkkürlər 😉

Kateqoriyalar: MySQL Etiketlər: , , , ,

SUM() function wrong output???

Noyabr 12, 2012 4 şərh

Çox maraqlı bir hadisə baş verib yəni mənə maraqlı gəldi və indi yazıram…
* Bu yazıda subquery,join(inner join) (hamısı da basic şəkildə) istifadə olunub…İrəlidə subquery və join haqqında ayrılıqda yazı yazacam yəqin ki *

Deməli bizim 2 table-ımız var:

CREATE TABLE sum_test (
  id int
);

CREATE TABLE sum_test2 (
  id int
);

İnsert edirik:

insert into sum_test() values(1),(2),(3),(4);

insert into sum_test2() values(1),(2),(3),(4),(5),(6);

Selectlər:


mysql> select * from sum_test;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql> select * from sum_test2;  
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+
6 rows in set (0.00 sec)

Gördüyümüz kimi, sum_test-də 4 , sum_test2-də isə 6 row var. *bu 4 və 6 rəqəmlərini yadda saxlayın\saxlayaq!!!*

İndi isə sum() funksiyası ilə işləyək biraz…Bu funksiya adından da göründüyü kimi summary\sum yəni toplama əməliyyatını yerinə yetirir.
Əgər sınasaq:

-- sum_test üçün
mysql> select sum(id) from sum_test;
+---------+
| sum(id) |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)

-- sum_test2 üçün

mysql> select sum(id) from sum_test2; 
+---------+
| sum(id) |
+---------+
|      21 |
+---------+
1 row in set (0.00 sec)

Bəli həqiqətən də sum_test üçün: 1+2+3+4=10 edir. sum_test2 üçün isə: 1+2+3+4+5+6=21 edir. Nə gözəl nə qəşəy…
Yaxşı deyək ki, indi bizə lazımdır sum_test və sum_test2 üçün sum-ları eyni anda çıxarım.Yəni 2 table-dan məlumat çıxarım. Burda istifadə olunacaq join (və yaxud inner join).

select 
    sum(sum_test2.id), sum(sum_test.id)
from
    sum_test,
    sum_test2;

Məntiqlə fikirləşsək dərhal demək olar ki, cavabımız 21 və 10 olacaq…Yuxarıdakı misala uyğun olaraq bu belə olmalıdır…Amma ki :

Bir yerdən külək əsir elə bil 😀
Yaxşı məntiqimiz suya düşdü ama niyə???
Deməli Join-də belə bir qayda var ki, əgər join-i heç bir şərtsiz(where-siz meselen) yerinə yetirsək. O zaman son nəticədə görsənəcək row sayı fərqli olacaq və belə hesablanacaq: sum_test-də 4 row , sum_test2-də isə 6…Join nəticəsi olaraq 4×6=24 row çıxacaq

Göstərək:

Həqiqətən də 24 row çıxır…Və məncə şəkildən də aydın olur, bu 84 və 60 cavabları hardan peyda olub 🙂
Yəni ordakı sol və sağda olan rəqəmləri topladıqda 84 və 60 alınır…

Bəs onda çıxış yolu nədədir??? Sadə bir Subquery:

select (select sum(id) from sum_test2),(select sum(id) from sum_test) from dual;

Hətta hər hansı riyazi əməliyyatlar da aparmaq olar.Məsələn:

mysql> select (select sum(id) from sum_test2)+(select sum(id) from sum_test) as sum;
+------+
| sum  |
+------+
|   31 |
+------+
1 row in set (0.00 sec)

Təşəkkürlər 🙂

Kateqoriyalar: MySQL Etiketlər: , , , ,