2011-10-14 4 views
1

Problèmes lors de l'obtention d'un jeu de données à renvoyer avec une date par client dans la requête.TSQL - Retour date récente

Exigences:

  • doit avoir la date récente de la transaction par la liste des clients pour les utilisateurs
  • aura besoin avoir la capacité de courir à travers EXEC

actuelle Requête:

SELECT 
    c.client_uno 
    , c.client_code 
    , c.client_name 
    , c.open_date 
into #AttyClnt 
from hbm_client c 
    join hbm_persnl p on c.resp_empl_uno = p.empl_uno 
where p.login = @login 
    and c.status_code = 'C' 

select 
    ba.payr_client_uno as client_uno 
    , max(ba.tran_date) as tran_date 
from blt_bill_amt ba 
    left outer join #AttyClnt ac on ba.payr_client_uno = ac.client_uno 
where ba.tran_type IN ('RA', 'CR') 
group by ba.payr_client_uno 

Actuellement, cette requête produira au moins 1 ligne par client avec une date, le problème est qu'il y a des clients qui auront entre 2 et 10 dates qui leur sont associées, gonflant la table de retour à environ 30 000 rangées au lieu d'un idéaliste de 246 lignes ou moins. Lorsque j'essaie de faire max (tran_uno) pour obtenir le numéro de transaction le plus récent, j'obtiens le même résultat, certains ont une valeur et d'autres ont plusieurs valeurs.

La plus grande image a 4 autres requêtes étant effectuées en faisant d'autres parties, j'ai seulement inclus les parties qui se rapportent à la question.

Edit (2011-10-14 @ 13:45):

select 
    ba.payr_client_uno as client_uno 
    , max(ba.row_uno) as row_uno 
into #Bills 
from blt_bill_amt ba 
    inner join hbm_matter m on ba.matter_uno = m.matter_uno 
     inner join hbm_client c on m.client_uno = c.client_uno 
      inner join hbm_persnl p on c.resp_empl_uno = p.empl_uno 
where p.login = @login 
    and c.status_code = 'C' 
    and ba.tran_type in ('CR', 'RA') 
group by ba.payr_client_uno 
order by ba.payr_client_uno 

--Obtain list of Transaction Date and Amount for the Transaction 
select 
    b.client_uno 
    , ba.tran_date 
    , ba.tc_total_amt 
from blt_bill_amt ba 
    inner join #Bills b on ba.row_uno = b.row_uno 

Pas tout à fait sûr de ce qui se passait, mais semble les tables temporaires ne sont pas du tout droit agissent. Idéalement, je disposerais de 246 lignes de données, mais avec la syntaxe de requête précédente, il produirait de 400 à 5000 lignes de données, évidemment des duplications sur des données.

+0

Je ne pense pas que le problème est là. Ce que vous affichez ici ne renverra qu'une date par client_uno, puisque vous groupez par valeur. Peut-il y avoir des espaces dans le nom du client qui donne l'impression que le même client renvoie plusieurs dates? –

+0

le client_uno est une valeur 'int' unique et n'a donc pas d'espace blanc ou de valeurs erronées. la valeur est contrôlée à l'arrière de l'application. – GoldBishop

+0

Une autre remarque, dans certains cas lorsqu'on regarde l'ensemble de données résultant, certains client_uno ont un enregistrement CR & RA et d'autres ont un double enregistrement CR ou RA, et le reste est une valeur CR ou RA unique.Maintenant vous voyez le problème, ce n'est pas toujours revenir une valeur que je peux fixer le problème. Plus d'un point culminant de problèmes qui ne sont pas très cohérents sauf par le client_uno que j'interroge. – GoldBishop

Répondre

2

Je pense que vous pouvez utiliser le classement pour obtenir ce que vous voulez:

WITH ranked AS (
    SELECT 
    client_uno = ba.payr_client_uno, 
    ba.tran_date, 
    be.tc_total_amt, 
    rnk = ROW_NUMBER() OVER (
     PARTITION BY ba.payr_client_uno 
     ORDER BY  ba.tran_uno DESC 
    ) 
    FROM blt_bill_amt ba 
    INNER JOIN hbm_matter m ON ba.matter_uno = m.matter_uno 
    INNER JOIN hbm_client c ON m.client_uno = c.client_uno 
    INNER JOIN hbm_persnl p ON c.resp_empl_uno = p.empl_uno 
    WHERE p.login = @login 
    AND c.status_code = 'C' 
    AND ba.tran_type IN ('CR', 'RA') 
) 
SELECT 
    client_uno, 
    tran_date, 
    tc_total_amt 
FROM ranked 
WHERE rnk = 1 
ORDER BY client_uno 

Lecture utile:

+0

Je vais essayer cela quand revenir au client .... je ne savais pas qu'il y avait un mécanisme de classement pour SQL 2005 – GoldBishop

+0

Bravo Andriy .... il fonctionne provisoirement .... en attente de vérification. Et merci pour les liens .... je vais lire ces articles pour plus de lecture. – GoldBishop

+0

Andriy .... pourquoi devrais-je recevoir ce message "Msg 155, niveau 15, état 1, ligne 70 'mattranked' n'est pas une option GROUP BY reconnue." Après avoir jeté l'instruction Select dans une table temporaire, elle a ajouté "Into #LastPay". Ou est-ce quelque chose que je suis incapable de faire et je devrais faire la jointure à la requête finale? – GoldBishop

Questions connexes