2014-01-08 3 views
2

Я пытаюсь сделать простой математический расчет на столе, что у меня есть ниже,как вычислить веса в MySQL

+-----------+---------+----------+-------+-------+ 
    | Cty_lst | Cty_Rgn | Criteria | Total | Sntmt | 
    +-----------+---------+----------+-------+-------+ 
    | ALL  | ALL  | ALL  | 3155 | ALL | 
    | Bangalore | ALL  | ALL  | 628 | ALL | 
    | Chennai | ALL  | ALL  | 337 | ALL | 
    | Delhi  | ALL  | ALL  | 263 | ALL | 
    | Gurgaon | ALL  | ALL  | 282 | ALL | 
    | Hyderabad | ALL  | ALL  | 406 | ALL | 
    | Mumbai | ALL  | ALL  | 482 | ALL | 
    | Noida  | ALL  | ALL  | 235 | ALL | 
    | Pune  | ALL  | ALL  | 522 | ALL | 
    +-----------+---------+----------+-------+-------+ 

я пытаюсь вычислить вес каждого города, который consititutes всем, что-то вроде результата таблица ниже, wt_calc вычисляется путем деления общей суммы города/всего например city ​​bangalore wt рассчитывается по 628/3155 = 19.90. я попробовал много изменений ниже кода

SELECT Cty_lst , cty_rgn,Criteria, total,Sntmt, 
     (100*SUM(CASE WHEN Sntmt = 'all' AND Cty_lst != 'all' THEN total END) 
    /
     SUM(CASE WHEN Sntmt = 'all' AND Cty_lst = 'all' THEN total END) 
     ) AS wt_calc 
FROM citytable 
GROUP BY Srvy_cty 

    +-----------+---------+----------+-------+-------+---------+ 
    | Cty_lst | Cty_Rgn | Criteria | Total | Sntmt | Wt_Calc | 
    +-----------+---------+----------+-------+-------+---------+ 
    | ALL  | ALL  | ALL  | 3155 | ALL | 100  | 
    | Bangalore | ALL  | ALL  | 628 | ALL | 19.90 | 
    | Chennai | ALL  | ALL  | 337 | ALL | 10.68 | 
    | Delhi  | ALL  | ALL  | 263 | ALL | 8.34 | 
    | Gurgaon | ALL  | ALL  | 282 | ALL | 8.94 | 
    | Hyderabad | ALL  | ALL  | 406 | ALL | 12.87 | 
    | Mumbai | ALL  | ALL  | 482 | ALL | 15.28 | 
    | Noida  | ALL  | ALL  | 235 | ALL | 7.45 | 
    | Pune  | ALL  | ALL  | 522 | ALL | 16.55 | 
    +-----------+---------+----------+-------+-------+---------+ 
+0

У вас есть сумма всех городов, как одна отдельная строка в таблице? Это будет странный дизайн стола. –

+0

Есть ли строка со значением 'Cty_lst = 'ALL'' или она рассчитана? – AgRizzo

+0

И что такое srvy_cty, вы не ссылаетесь на него в предложении select? – AgRizzo

ответ

0
CREATE TABLE Table1 
    (`Cty_lst` varchar(9), `Cty_Rgn` varchar(3), `Criteria` varchar(3), `Total` int, `Sntmt` varchar(3)) 
; 

INSERT INTO Table1 
    (`Cty_lst`, `Cty_Rgn`, `Criteria`, `Total`, `Sntmt`) 
VALUES 
    ('ALL', 'ALL', 'ALL', 3155, 'ALL'), 
    ('Bangalore', 'ALL', 'ALL', 628, 'ALL'), 
    ('Chennai', 'ALL', 'ALL', 337, 'ALL'), 
    ('Delhi', 'ALL', 'ALL', 263, 'ALL'), 
    ('Gurgaon', 'ALL', 'ALL', 282, 'ALL'), 
    ('Hyderabad', 'ALL', 'ALL', 406, 'ALL'), 
    ('Mumbai', 'ALL', 'ALL', 482, 'ALL'), 
    ('Noida', 'ALL', 'ALL', 235, 'ALL'), 
    ('Pune', 'ALL', 'ALL', 522, 'ALL') 
; 

select 
t.* 
, Total/@total * 100 
from 
Table1 t 
, (select @total := (select Total from Table1 where Cty_lst = 'ALL' limit 1)) vars 

| CTY_LST | CTY_RGN | CRITERIA | TOTAL | SNTMT | TOTAL/@TOTAL * 100 | 
|-----------|---------|----------|-------|-------|----------------------| 
|  ALL |  ALL |  ALL | 3155 | ALL |     100 | 
| Bangalore |  ALL |  ALL | 628 | ALL |    19.9049 | 
| Chennai |  ALL |  ALL | 337 | ALL |    10.6815 | 
|  Delhi |  ALL |  ALL | 263 | ALL |    8.336 | 
| Gurgaon |  ALL |  ALL | 282 | ALL |    8.9382 | 
| Hyderabad |  ALL |  ALL | 406 | ALL |    12.8685 | 
| Mumbai |  ALL |  ALL | 482 | ALL |    15.2773 | 
|  Noida |  ALL |  ALL | 235 | ALL |    7.4485 | 
|  Pune |  ALL |  ALL | 522 | ALL |    16.5452 | 
-1

Я бы не стал ставить общее количество городов в ряд. Если вы хотите сохранить, что я хотел бы сделать что-то вроде следующего:

SELECT Cty_lst , cty_rgn,Criteria, total,Sntmt,  
    (CASE when Sntmt = 'all' AND Cty_lst != 'all' THEN total ELSE total/sum(total) 
END) AS wt_calc 
FROM citytable 
GROUP BY Srvy_cty 

Но лучше было бы просто бросить общий ряд и сделать это:

SELECT Cty_lst , cty_rgn,Criteria, total,Sntmt,  
    total/sum(total) as wt_calc 
FROM citytable 
GROUP BY Srvy_cty 
0

Брось строку со значениями ALL прочь а затем использовать:

SELECT Cty_lst , cty_rgn,Criteria, total,Sntmt, 
    Total/(SELECT SUM(Total) FROM citytable) AS wt_calc 
FROM citytable 

http://sqlfiddle.com/#!2/27040f/7

+0

попробовал предложенный код, но не получил ожидаемых результатов, так как все значения возвращаются как 1 –

+0

Смотрите скрипку! Оно работает. – niyou

+0

Я проверил на скрипке, и это [результат] (http://sqlfiddle.com/#!2/27040f/6) я получаю –

0

Если я правильно понимаю, это должно сделать это:

SELECT Cty_lst , cty_rgn,Criteria, total,Sntmt, 
     (100* total)/
     (SELECT total FROM citytable WHERE Sntmt = 'all' AND Cty_lst = 'all') 
     ) AS wt_calc 
FROM citytable 
0

Попробуйте

SELECT 
     a.*, 
    round((a.Total/SUM(b.Total))*100,2) as weight 
FROM 
     citytable as a, 
     citytable as b 
WHERE 
     b.CTY_LST != 'ALL' 
GROUP BY 
     a.CTY_LST; 

демо на http://sqlfiddle.com/#!2/cbc23/17

Смежные вопросы