2015-10-27 4 views
0

J'ai une table hw1 comme celui-ci:Comment calculer le ratio dans Mysql?

+--------+--------+----------+ 
| budget | price | count(*) | 
+--------+--------+----------+ 
| high | high |  9 | 
| high | low |  13 | 
| high | medium |  20 | 
| low | high |  60 | 
| low | low |  94 | 
| low | medium |  162 | 
| medium | high |  151 | 
| medium | low |  228 | 
| medium | medium |  355 | 
+--------+--------+----------+ 

et je voudrais ajouter une autre colonne à droite qui ressemble à "count(*)/budget taille de l'échantillon » Par exemple, pour la première rangée where budget = high and price = high, nous obtiendrions un certain nombre calculated by 9/42 (42 est la taille de l'échantillon budgétaire élevé = [9 + 13 + 20])

I ont essayé le code ci-dessous, mais le résultat est nul

select (select count(*) from hw1 where count(*) like 'a%')/
(select count(*) from hw1 where budget like 'b%') from hw1; 

Je crois que ce n'est pas dur mais je ne peux pas obtenir le résultat .. quelqu'un pourrait s'il vous plaît m'aider avec gentillesse? Je ne suis pas très expérimenté dans mysql ..

Merci à l'avance.

Répondre

1

Vous pouvez utiliser une autre requête pour obtenir la "taille d'échantillon de budget" pour chaque valeur de budget, puis utiliser le résultat de cette requête en tant que source de ligne.

(absence d'une définition des données de la table et par exemple, on ne fait que deviner la requête que vous utilisez pour obtenir.)

SELECT r.budget 
     , COUNT(*) AS budget_sample_size 
    FROM hw1 r 
    GROUP BY r.budget 

Nous nous attendons à ce que la requête retournerait un résultat avec une ligne par valeur de budget, par exemple

budget budget_sample_size 
    ------ ------------------ 
    high     42 
    low     316 
    medium     734 

L'astuce consiste maintenant à utiliser cette requête comme une rowsource dans une autre requête. Nous enveloppons cette requête dans parens et la référencons dans la clause FROM d'une autre requête, comme s'il s'agissait d'une table. Comme un exemple simple ...En utilisant une requête comme celle-ci, en tant que rowsource, nous pouvons avoir les valeurs retournées par la requête disponibles dans la requête externe. Une requête utilisée comme une rowsource comme celle-ci est appelée "vue en ligne". Dans le système venaculaire de MySQL, on l'appelle une "table dérivée".

À titre d'exemple de ce que cette requête pourrait ressembler à:

SELECT t.budget 
     , t.price 
     , COUNT(*) 
     , s.budget_sample_size 
     , COUNT(*)/s.budget_sample_size 
    FROM hw1 t 
    JOIN ( 
      SELECT r.budget 
       , COUNT(*) AS budget_sample_size 
      FROM hw1 r 
      GROUP BY r.budget 
     ) s 
    ON s.budget = t.budget 
    GROUP 
    BY t.budget 
     , t.price 

Note: Cet exemple requête repose sur une extension spécifique à MySQL au comportement GROUP BY. D'autres bases de données généreraient une erreur ("non agrégé dans la liste SELECT non dans GROUP BY"). Il suffit d'un petit ajustement à la requête pour l'amener à travailler dans d'autres bases de données ... par ex. ajoutez une fonction d'agrégation MAX() ... remplacez les expressions s.budget_sample_size par MAX(s.budget_sample_size).

+0

Merci beaucoup pour l'explication articulée et tous les efforts. J'apprends beaucoup. –

+0

Il existe d'autres modèles de requête qui obtiendront un résultat équivalent. Par exemple, en utilisant une sous-requête corrélée dans la liste SELECT. Cette réponse décrit seulement l'une des approches possibles, en utilisant une "vue en ligne". – spencer7593

0

S'il vous plaît changer le nom du champ 'count (*)'
et peut-être préciser votre question
Cependant

SELECT 
(SELECT [count(*)] FROM hw1 WHERE budget like 'high' AND price like 'high')/
(SELECT SUM([count(*)]) FROM hw1 WHERE budget like 'high') 
+0

Merci pour la réponse, si je veux obtenir tout le ratio pour toutes les lignes de la table hw1, est-ce que je peux utiliser 'a%' et 'b%'? –

+0

je ne comprends pas –

0

Puisque vous n'avez pas fourni ni votre structure des tables d'origine, ni les données brutes source ni votre requête - voici ma conjecture approche:

SELECT hw1.*, 
     count(*) count_price, 
     (count(*)/b.budget_all) price_share 
FROM hw1 
LEFT JOIN (
    SELECT budget, COUNT(*) budget_all 
    FROM hw1 
    GROUP BY budget 
) b 
ON b.budget = hw1.budget 
0

Salut là si j'ai compris votre réponse correc TLY, je pense que vous pourriez faire quelque chose comme ça

SELECT t1.buget, t1.price, t1.cnt, t1.cnt/t2.sumCnt 
FROM myTable AS t1 
INNER JOIN (SELECT buget, SUM(cnt) AS sumCnt 
      FROM myTable 
      GROUP BY buget) AS t2 
ON t1.buget = t2.buget; 

il est simple jointure déclaration et sous-requête interne retournera résultat comme celui-ci

buget | sumCtn 
    -------------- 
    high | 42 
    -------------- 
    low | 316 
    -------------- 

etc ...

vous pouvez faire sou tapis simples dans l'instruction select quand joindre ceci avec votre table ...

Notez également que je change un petit nom de votre colonne ainsi ne soyez pas confondu par cela ..

GL!

P.S. Voici SQL FIDDLE pour voir comment cela fonctionne ...