2012-06-29 7 views
0

Mise à jour # 1: requête me donne erreur de syntaxe sur gauche ligne de jointure (exécution de la requête au sein de la jointure gauche fonctionne indépendamment parfaitement bien)requête imbriquée et transaction

SELECT b1.company_id, ((sum(b1.credit)-sum(b1.debit)) as 'Balance' 

FROM MyTable b1 
JOIN CustomerInfoTable c on c.id = b1.company_id 

#Filter for Clients of particular brand, package and active status 
where c.brand_id = 2 and c.status = 2 and c.package_id = 3 

LEFT JOIN 
(
    SELECT b2.company_id, sum(b2.debit) as 'Current_Usage' 
    FROM MyTable b2 
    WHERE year(b2.timestamp) = '2012' and month(b2.timestamp) = '06' 
    GROUP BY b2.company_id 
) 
b3 on b3.company_id = b1.company_id 
group by b1.company_id; 

Original Post:

Je garde une trace des débits et crédits dans la même table. Le tableau a le schéma suivant:

| company_id | timestamp | credit | debit | 
| 10 | MAY-25 | 100 | 000 | 
| 11 | MAY-25 | 000 | 054 | 
| 10 | MAY-28 | 000 | 040 | 
| 12 | JUN-01 | 100 | 000 | 
| 10 | JUN-25 | 150 | 000 | 
| 10 | JUN-25 | 000 | 025 | 

Comme mon résultat, je veux voir:

| Grouped by: company_id | Balance* | Current_Usage (in June) | 
| 10 | 185 | 25 | 
| 12 | 100 | 0 | 
| 11 | -54 | 0 | 

Solde: Calculé par (somme (crédit) - somme (débits)) * - l'horodatage n'a pas d'importance
Current_Usage: Calculé par sum (débits) - mais seulement pour les débits en JUIN. Le problème: Si je filtre tout de suite l'horodatage JUN, il ne calcule pas le solde de tous les temps mais seulement le solde de toutes les transactions en juin.

Comment puis-je calculer l'utilisation actuelle par mois, mais le solde sur toutes les transactions dans le tableau. J'ai tout fonctionne, sauf qu'il filtre uniquement les résultats JUN dans le calcul de l'utilisation actuelle dans mon code:

SELECT b.company_id, ((sum(b.credit)-sum(b.debit))/1024/1024/1024/1024) as 'BW_remaining', sum(b.debit/1024/1024/1024/1024/28*30) as 'Usage_per_month' 

FROM mytable b 

#How to filter this only for the current_usage calculation? 
WHERE month(a.timestamp) = 'JUN' and a.credit = 0 


#Group by company in order to sum all entries for balance 
group by b.company_id 
order by b.balance desc; 

Répondre

0

ce que vous aurez besoin, une jointure avec sous requête qui filtrera en fonction de mois.

SELECT T1.company_id, 
     ((sum(T1.credit)-sum(T1.debit))/1024/1024/1024/1024) as 'BW_remaining', 
     MAX(T3.DEBIT_PER_MONTH) 
FROM MYTABLE T1 
LEFT JOIN 
(
    SELECT T2.company_id, SUM(T2.debit) T3.DEBIT_PER_MONTH 
    FROM MYTABLE T2 
    WHERE month(T2.timestamp) = 'JUN' 
    GROUP BY T2.company_id 
) 
T3 ON T1.company_id-T3.company_id 
GROUP BY T1.company_id 

Je n'ai pas testé la requête. Le point ici que je suis en train de faire est de savoir comment vous pouvez rejoindre votre requête existante pour obtenir l'utilisation par mois.

+0

Je reçois une erreur de syntaxe sur la jointure gauche. Si je lance juste la requête dans la jointure, ça passe bien: Je cours la requête suivante: ### mise à jour: Il est vraiment difficile de mettre en forme le code dans le commentaire ainsi j'ai mis à jour la question avec le code sous la mise à jour # 1 –

0

Très bien, merci à @Kshitij Je l'ai réussi. Dans le cas où quelqu'un d'autre se heurte au même problème, voici comment je l'ai résolu:

SELECT b1.company_id, ((sum(b1.credit)-sum(b1.debit)) as 'Balance', 
    (
    SELECT sum(b2.debit) 
    FROM MYTABLE b2 
    WHERE b2.company_id = b1.company_id and year(b2.timestamp) = '2012' and month(b2.timestamp) = '06' 
    GROUP BY b2.company_id 
) AS 'Usage_June' 

FROM MYTABLE b1 

#Group by company in order to add sum of all zones the company is using 
group by b1.company_id 
order by Usage_June desc;