Sélectionnez l'AFFAIRE Instruction SQL Server 2008 R2
J'ai une requête qui utilise un CASE
déclaration pour marquer des comptes. La requête recherche les valeurs dans une forme vectorielle. Donc par exemple si je suis patient, je peux avoir plusieurs codes de diagnostic applicables, mais ils ne sont pas stockés en tant que valeurs de la colonne, ils sont stockés dans une autre ligne comme:
VISIT_ID | CLASFCD
123 | 196.0
123 | 197.0
123 | 198.0
321 | 199.0
321 | 650.9
222 | 111
555 | ...
...
Ma requête utilise un Cas de Tresorerie comme suit:
, CASE
WHEN DV.ClasfCd IN (
'196.0','196.1','196.2','196.3','196.5','196.6','196.8','196.9',
'197.0','197.1','197.2','197.3','197.4','197.5','197.6','197.7',
'197.8','198.2','198.3','198.4','198.5','199.1','209.7'
)
THEN 6
ELSE 0
END AS PRIN_DX_CD_5
Je fais cela pour 5 différents groupes de codes. Ce qui se passe, c'est que si les critères sont réunis pour l'un de ces groupes, les résultats sont de retour dans une autre ligne au lieu de sur la même ligne. Voici un exemple de données que je suis de retour:
VISIT_ID | CC GROUP 1 | CC GROUP 2 | CC GROUP 3 | CC GROUP 4 | CC GROUP 5 | TOTAL
123 | 1 | 0 | 0 | 0 | 0 | 1
123 | 0 | 2 | 0 | 0 | 0 | 2
123 | 0 | 0 | 0 | 0 | 0 | 0
Ce que je veux retournée est la suivante:
VISIT_ID | CC GROUP 1 | CC GROUP 2 | CC GROUP 3 | CC GROUP 4 | CC GROUP 5 | TOTAL
123 | 1 | 2 | 0 | 0 | 0 | 3
321 | 1 | 0 | 0 | 0 | 6 | 6
La dernière score total ne peut pas dépasser 6.
L'intégralité de la requête dans certains brièveté est ici, c'est une partie d'une partie multi-requête, je suis apporter des modifications à l'original:
SET ANSI_NULLS OFF
GO
DECLARE @SD DATETIME
DECLARE @ED DATETIME
SET @SD = '2013-01-01';
SET @ED = '2013-05-31';
-- @CM TABLE DECLARATION #############################################]
DECLARE @CM TABLE (
ENCOUNTER_ID VARCHAR(200)
, [MRN CM] VARCHAR(200)
, NAME VARCHAR(500)
, [CC GRP ONE SCORE] VARCHAR(20)
, [CC GRP TWO SCORE] VARCHAR(20)
, [CC GRP THREE SCORE] VARCHAR(20)
, [CC GRP FOUR SCORE] VARCHAR(20)
, [CC GRP FIVE SCORE] VARCHAR(20)
, [CC LACE SCORE] INT
)
--####################################################################]
INSERT INTO @CM
SELECT
C.PT_NO
, C.MED_REC_NO
, C.PT_NAME
, C.PRIN_DX_CD_1
, C.PRIN_DX_CD_2
, C.PRIN_DX_CD_3
, C.PRIN_DX_CD_4
, C.PRIN_DX_CD_5
, CASE
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 0 THEN 0
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 1 THEN 1
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 2 THEN 2
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 3 THEN 3
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 4 THEN 4
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) = 5 THEN 5
WHEN (C.PRIN_DX_CD_1+C.PRIN_DX_CD_2+C.PRIN_DX_CD_3+C.PRIN_DX_CD_4+C.PRIN_DX_CD_5) >= 6 THEN 6
END AS CC_LACE_SCORE
FROM (
SELECT DISTINCT PAV.PT_NO
, MED_REC_NO
, PT_NAME
, CASE
WHEN dv.ClasfCd IN (
)
THEN 1
ELSE 0
END AS PRIN_DX_CD_1
, CASE
WHEN DV.ClasfCd IN (
)
THEN 2
ELSE 0
END AS PRIN_DX_CD_2
, CASE
WHEN DV.ClasfCd IN (
)
THEN 3
ELSE 0
END AS PRIN_DX_CD_3
, CASE
WHEN DV.ClasfCd IN (
)
THEN 4
ELSE 0
END AS PRIN_DX_CD_4
, CASE
WHEN DV.ClasfCd IN (
)
THEN 6
ELSE 0
END AS PRIN_DX_CD_5
FROM smsdss.BMH_PLM_PtAcct_V PAV
JOIN smsdss.BMH_PLM_PtAcct_Clasf_Dx_V DV
ON PAV.PtNo_Num = DV.PtNo_Num
WHERE Dsch_Date BETWEEN @SD AND @ED
)C
GROUP BY C.PT_NO
, C.MED_REC_NO
, C.PT_NAME
, C.PRIN_DX_CD_1
, C.PRIN_DX_CD_2
, C.PRIN_DX_CD_3
, C.PRIN_DX_CD_4
, C.PRIN_DX_CD_5
ORDER BY C.Pt_No
SELECT * FROM @CM
merci pour votre aide,
PIVOT
commande? technet.microsoft.com/en-us/library/ms177410.aspxje n'ai jamais utilisé le
PIVOT
de commande. Ne l'aide que m'empêcher de prendre des valeurs à partir d'une requête qui suit?
OriginalL'auteur MCP_infiltrator | 2013-12-13
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes incluant le calcul
PRIN_DX_
colonnes dans l'agrégation. Au lieu de cela, les retirer de l'agrégation et il suffit de choisir la non-valeur de 0 (à l'aide demax()
):Je soupçonne le
distinct
dans la sous-requête peut ne pas être nécessaire, mais cela dépend de ce que vos données ressemble vraiment.Qui semble avoir fixé. Merci Gordon
OriginalL'auteur Gordon Linoff
Mise à JOUR:
Vous defenitly besoin de chercher pivot @Darren Kopp dit
Créer la table à carte à vos valeurs dans
IN
clauses avec des groupesPuis faire pivot
Puis simpify votre cas quand
minimum(val, 6)
en utilisant quelque chose commeDe sorte que votre table cdmap serait
vous a donné quelques liens. ajoutée le cadre de pivot de requête pour commencer, essayez de finir par vous-même. vérifiez également que la croix/externe s'appliquent.
Merci pour tous les liens, il sera très utile pour moi dans l'avenir, mon école semestre se termine le dimanche quand j'ai la main dans mon examen final, ce qui permettra de faire de bonnes hiver de la lecture.
OriginalL'auteur vittore