2016-10-19 1 views
0

Donc, si plus d'un enregistrement existe pour la même personne, je dois les montrer comme un seul enregistrement dans le jeu de résultats et account_status_value => 'RFND' et 'ACTV' devrait apparaître comme colonne dans cet enregistrement unique avec ' y 'flag et leurs services totaux devraient également apparaître dans une colonne séparée.AJAX QUERY HADOOP

person_id First_nm Last_nm   RFND ACTV RFND_SERVICE ACTV_SERVICE 
000130  aaa ssss.... 'Y' 'Y' 3004   8953

J'ai essayé le pivot ça ne fonctionne pas ... aucune idée pour y parvenir?

+0

fyi: il est considéré comme très impoli ici d'afficher des images de texte, même formatées comme vos résultats. Il est également plus difficile pour vous d'obtenir de l'aide, car nous devrons peut-être retaper cela pour créer un ensemble de données à utiliser pour tester nos solutions. Cela empêchera certaines personnes de même lire plus loin dans la question. Management Studio dispose d'une option dans la barre d'outils pour présenter les résultats sous forme de texte que vous copiez/collez dans Stack Overflow. –

Répondre

1

Le vrai problème ici est que même si la personne est la même, le compte est différent. En incluant cela dans les résultats et dans le GROUP BY, vous empêchez les enregistrements de se dérouler comme vous le souhaitez. Si vous supprimez cela des résultats et du GROUP BY, les choses commencent à mieux fonctionner. Vous pouvez ensuite les replacer dans les résultats en utilisant un CASE en combinaison avec une fonction d'agrégation ... sachez que s'il y a plus d'un compte RFND ou ACTV, vous ne pouvez pas être sûr de ce que vous obtenez avec ceci :

SELECT SVC.PERSON_ID, SVC.FIRST_NM, SVC.LAST_NM, 
    SUM(SVC.LEGACY_SVC_DAYS) As LEGACY_SVC_DAYS, 
    SUM(ISNULL(ACTUAL_SERVICE_YEARS,0)) * 365 + SUM(ISNULL(ACTUAL_SERVICE_MONTHS,0)) * 30 + SUM(ISNULL(ACTUAL_SERVICE_DAYS,0)) AS TOTAL_SERVICE, 
    CAST((SUM(ISNULL(ACTUAL_SERVICE_YEARS,0)) * 365 + SUM(ISNULL(ACTUAL_SERVICE_MONTHS,0)) * 30 + SUM(ISNULL(ACTUAL_SERVICE_DAYS,0))) AS INT)/365 AS TOTAL_YEARS, 
    (CAST((SUM(ISNULL(ACTUAL_SERVICE_YEARS,0)) * 365 + SUM(ISNULL(ACTUAL_SERVICE_MONTHS,0)) * 30 + SUM(ISNULL(ACTUAL_SERVICE_DAYS,0)))AS INT) % 365)/30 AS TOTAL_MONTHS, 
    ((SUM(ISNULL(ACTUAL_SERVICE_YEARS,0)) * 365 + SUM(ISNULL(ACTUAL_SERVICE_MONTHS,0)) * 30 + SUM(ISNULL(ACTUAL_SERVICE_DAYS,0))) % 365) % 30 AS TOTAL_DAYS, 

    -------- New --------- 
    CASE WHEN MAX(CASE WHEN SPA.ACCOUNT_STATUS_VALUE = 'RFND' THEN SPA.PERSON_ACCOUNT_ID ELSE 0 END) > 0 THEN 'Y' ELSE 'N' END AS RFND, 
    CASE WHEN MAX(CASE WHEN SPA.ACCOUNT_STATUS_VALUE = 'ACTV' THEN SPA.PERSON_ACCOUNT_ID ELSE 0 END) > 0 THEN 'Y' ELSE 'N' END AS ACTV 
    MAX(CASE WHEN SPA.ACCOUNT_STATUS_VALUE = 'RFND' THEN SPA.PERSON_ACCOUNT_ID ELSE 0 END) AS RFND_SERVICE, 
    MAX(CASE WHEN SPA.ACCOUNT_STATUS_VALUE = 'ACTV' THEN SPA.PERSON_ACCOUNT_ID ELSE 0 END) AS ACTV_SERVICE 

FROM RECON_CREDIT_SVC SVC 
INNER JOIN PERSON_ACCOUNT SPA ON SPA.PERSON_ID = SVC.PERSON_ID 
INNER JOIN PA_SERVICE_SUMMARY_BKUP_10152016 PSS ON PSS.PERSON_ACCOUNT_ID = SPA.PERSON_ACCOUNT_ID 

GROUP BY SVC.PERSON_ID, SVC.LEGACY_SVC_DAYS, SVC.FIRST_NM, SVC.LAST_NM 
+0

Ici, dans RFND_SERVICE Il montre person_account_id. Nous avons besoin de service sur cette colonne. – Domnic

+0

Je dois afficher TOTAL_MONTHS, TOTAL_YEARS, TOTAL_DAYS en fonction de l'état (RFND, ACTV) – Domnic

+0

Je commence à penser que vous voulez joindre à la table PERSON_ACCOUNT deux fois ... une jointure tire les enregistrements RFND, et l'autre tire le Enregistrements ACTV. Peut-être même une troisième fois pour quand vous avez besoin de tout. –