2010-08-25 6 views
2

Voici ma requête en cours:Je dois améliorer ma requête T-SQL afin que je puisse retourner la somme des colonnes

SELECT patron_name, 
    producer.federal_number, 
    hst_number, 
    average_bf_test, 
    (SELECT MAX(s.statement_number) FROM statement s) AS statement_number, 
    (SELECT MAX(s.period_ending) FROM statement s) AS period_ending 
    FROM producer 
    JOIN producer_details ON producer.federal_number = producer_details.federal_number 
    JOIN statement ON producer.patron_number = statement.patron_number 
    WHERE producer.patron_number = @PatronNo 

je dois l'améliorer afin que je puisse récupérer la somme des colonnes d'argent dans ma table 'paiement':

quota_payment (money) 
    total_deductions (money) 
    net_cheque_or_direct_deposit (money) 
    interim_payment (money) 
    final_payment (money) 
    statement_number (int) (FK) (statement_number is the primary key in the statement table) 

Comme par @ la demande de Quassnoi, voici des exemples de données et @ la sortie de la requête de Quassnoi:

producer Table: 
patron_number patron_name federal_number 
20109  A. Beaton 44373 

producer_details Table: 
federal_number hst_number average_bf_test 
44373  R999999999 0.0392 

statement Table: 
statement_number period_ending description   amount_shipped patron_number 
386    2009/07/30  Quota Milk Shipped 32.91   20109 
387    2009/11/30  Quota Milk Shipped 22.34   20109 

payment Table: 
quota_payment total_deductions net_cheque_or_direct_deposit interim_payment 
22872.5800  7526.6500   15345.9300     6520.7000 
18474.3400  4563.2300   13911.1100     3220.3000 
final_payment statement_number 
8825.2300  386 
10690.8100  387   

Ce sont les données renvoyées par la requête @ Quassnoi (à l'origine, la deuxième ligne était NULL pour les colonnes money, mais il s'avère que c'était parce qu'il n'y avait qu'une seule ligne dans la table de paiement à ce moment-là, mais j'ai depuis ajouté une ligne supplémentaire):

patron_name federal_number hst_number average_bf_test  
A. Beaton 44373   R999999999 0.0392       
A. Beaton 44373   R999999999 0.0392        

statement_number period_ending  quota_payment total_deductions 
387    2009/11/30  22872.5800  7526.6500 
387    2009/11/30  18474.3400  4563.2300 

net_cheque_or_direct_deposit interim_payment  final_payment 
15345.9300      6520.7000   8825.2300 
13911.1100      3220.3000   10690.8100 

Voici le recordset souhaité:

patron_name federal_number hst_number average_bf_test  
A. Beaton 44373   R999999999 0.0392 

statement_number period_ending  quota_payment total_deductions 
387    2009/11/30  41346.92  12089.88 


net_cheque_or_direct_deposit interim_payment  final_payment 
29257.04      9741.00    19516.04 

J'ai oublié de mentionner que les valeurs de somme pour les colonnes d'argent devraient être « l'année à ce jour » les valeurs (ce qui signifie des valeurs de l'année précédente ne seraient pas inclus dans les résultats de SUM), ce qui le rend un peu plus compliqué.

+0

J'ai besoin de chaque colonne monétaire de la table de paiement pour rester une colonne séparée dans les résultats renvoyés, mais la requête doit renvoyer la somme de toutes les lignes pour chaque colonne. – brookmarker

+2

Je pense que ma réponse fait ce que vous voulez, cependant, votre requête originale fait-elle ce que vous voulez? Il semble que vous vouliez des informations sur @PatronNo mais lorsque vous obtenez l'instruction MAX, vous obtiendrez l'instruction Max à partir de n'importe quel patron_nombre. Je ne suis pas sûr si c'est ce que vous voulez ou non, ou peut-être que je ne comprends pas vous interrogez correctement. – kralco626

+0

Oui, ma requête d'origine fait ce que je veux. J'ai besoin de récupérer le nombre de déclaration max et la période de paiement – brookmarker

Répondre

1

Vous pouvez essayez ceci:

Select 
patron_name, 
federal_number, 
hst_number, 
average_bf_test, 
statement_number, 
period_ending, 
sum(quota_payment) as quota_payment, 
sum(total_deductions) as total_deductions, 
sum(net_cheque_or_direct_deposit) as net_cheque_or_direct_deposit, 
sum(interim_payment) as interim_payment, 
sum(final_payment) as final_payment 
from (Quassnois Query here) a 
group by 
patron_name, 
federal_number, 
hst_number, 
average_bf_test, 
statement_number, 
period_ending 

Cela devrait vous aider à obtenir ce que vous voulez en fonction des données que vous avez affichées. Je ne sais pas si cela fait logique dans votre situation, mais cela devrait fonctionner.

+0

Oh mon frigo ça fonctionne vraiment .. merci à tous pour votre aide! – brookmarker

0

Si je comprends ce que vous cherchez à faire, cela devrait fonctionner, ne pas tester la syntaxe ...

en fonction de votre commentaire peut-être votre recherche:

Select a.*,sum(quota_payment) as sum_quota_payment, 
    sum(total_deductions) as sum_total_deductions, 
    sum(net_cheque_or_direct_deposit) as sum_net_cheque, 
    sum(interim_payment) as sum_interim_payment, 
    sum(final_payment) as sum_final_payment 

     from 
     (SELECT patron_name, 
      producer.federal_number, 
      hst_number, 
      average_bf_test, 
      (SELECT MAX(s.statement_number) FROM statement s) AS statement_number, 
      (SELECT MAX(s.period_ending) FROM statement s) AS period_ending 
      FROM producer 
      JOIN producer_details ON producer.federal_number = producer_details.federal_number 
      JOIN statement ON producer.patron_number = statement.patron_number 
      WHERE producer.patron_number = @PatronNo) 
    a left join payment ON a.statement_number = payment.statement_number 
+0

woops je proly besoin d'un groupe par là ne pas je. Essayez d'ajouter "group by a.statement_number" à la fin de chaque requête. Est-ce que ça vous va ce que vous voulez? – kralco626

+0

Pas tout à fait. Je reçois l'erreur "L'identificateur multi-parties" statement.statement_number "ne peut pas être lié." même avec le groupe ajouté à la fin. – brookmarker

+0

désolé, aurait dû utiliser les allias a. Essaye encore. – kralco626

1
SELECT patron_name, 
     producer.federal_number, 
     hst_number, 
     average_bf_test, 
     (
     SELECT MAX(s.statement_number) 
     FROM statement s 
     ) AS statement_number, 
     (
     SELECT MAX(s.period_ending) 
     FROM statement s 
     ) AS period_ending, 
     sums.* 
FROM producer 
JOIN producer_details 
ON  producer_details.federal_number = producer.federal_number 
JOIN statement so 
ON  so.patron_number = producer.patron_number 
CROSS APPLY 
     (
     SELECT SUM(quota_payment) AS quota_payment, 
       SUM(total_deductions) AS total_deductions, 
       SUM(net_cheque_or_direct_deposit) AS net_cheque_or_direct_deposit, 
       SUM(interim_payment) AS interim_payment, 
       SUM(final_payment) AS final_payment 
     FROM payment p 
     WHERE p.statement_number = so.statement_number 
     ) sums 
WHERE producer.patron_number = @PatronNo 
+0

Cela fonctionne, cependant, il retourne deux lignes de données plutôt qu'une (aussi il y avait des virgules manquantes par les SUMs). La première ligne de données est correcte, cependant, la deuxième ligne de données renvoie toutes les valeurs NULL pour les colonnes money et les autres données sont correctes. – brookmarker

+0

@brookmaker: pourriez-vous s'il vous plaît poster quelques exemples de données et la sortie de la requête? – Quassnoi

+0

@Q - +1 probablement une meilleure approche que la mienne. Sympa, je ne suis pas très familier avec cross apply. – kralco626

Questions connexes