2017-07-24 3 views
2

Bonjour,Partitionnement et commande dans les états de l'Union multiples

Je travaille sur une combinaison de plusieurs paramètres pour notre équipe de dashboarding dans une procédure stockée exécutable unique qu'ils pourraient copier dans Excel, puis laissez-les tableaux croisés dynamiques font quelque chose de magique. Cela étant dit, dans l'intérêt de cette question, je ne ferai référence qu'à un seul ensemble de données plus petit pour une seule mesure afin de rester simple. La façon dont ils veulent les en-têtes et des étiquettes est très spécifique pour c'est pourquoi les deux premiers jeux sont écrits comme ils sont. Je peux donner plus d'informations si nécessaire.

est ici les questions que je me demande si quelqu'un pourrait me aider:

  1. Ils veulent que le nom du mois de décharge dans la requête. C'est bien, mais une fois que j'ajouter la date de sortie (projected_d) dans la requête que je dois utiliser aussi un group by. Ceci est alors à l'origine une Month ou Measure sans données à disparaître complètement du jeu de résultats. Je voudrais montrer un zéro pour cette ligne plutôt que de disparaître. les zéros montreront si je retire la month et group by de la requête.

  2. Je ne peux pas utiliser une instruction ORDER BY pour la Months en raison de la Union All. Je souhaite afficher le nom du mois dans le jeu de résultats mais le commander par numéro MONTH. Je ne généralement pas les problèmes qui font que dans les requêtes normales, mais en raison des Union All s dans cette requête que j'ai des problèmes sur le lieu ou la façon de faire ce travail.

Voici la requête en cours et le jeu de résultats:

USE COMPANY_VHR_PROD 
GO 

DECLARE @MINDOS DATE, 
     @MAXDOS DATE, 
     @PRTFSuccess INT, 
     @PRTFTotal INT 

SET @MINDOS = '20170701' 
SET @MAXDOS = '20170803' 

SELECT @PRTFSuccess = COUNT(DISTINCT uniqueid_c) 
FROM cd.enrollments 
WHERE 
    program_c = 'PRTF' 
    AND level_c IN ('SIG', 'MOD') 
    AND projected_d BETWEEN @MINDOS AND @MAXDOS 

SELECT @PRTFTotal = COUNT(DISTINCT uniqueid_c) 
FROM cd.enrollments 
WHERE 
    program_c = 'PRTF' 
    AND projected_d BETWEEN @MINDOS AND @MAXDOS 

SELECT 
    '' AS "Program", 
    '' AS "Measurement", 
    '' AS "Month", 
    '' AS "Count or Total", 
    '' AS "Percentage or Average", 
    '' AS "YTD" 
WHERE 1=0 

UNION ALL 

SELECT 
    '', 
    '', 
    '', 
    '', 
    '', 
    '' 

UNION ALL 

SELECT 
    'PRTF', 
    'Client Response To Treatment', 
    'Month', 
    'Count', 
    'Percentage', 
    'YTD' 

UNION ALL 

SELECT 
    'PRTF' AS "Program", 
    CASE 
     WHEN e.level_c IS NULL THEN 'None Entered' 
     WHEN e.level_c = '' THEN 'None Entered' 
     WHEN e.level_c = 'SIG' THEN 'Significant Success Experienced' 
     WHEN e.level_c = 'MOD' THEN 'Moderate Success Experienced' 
     WHEN e.level_c = 'MILD' THEN 'Mild Success Experienced' 
     WHEN e.level_c = 'INS' THEN 'Insignificant Success Experienced' 
     ELSE e.level_c END AS "Success", 
    DATENAME(MONTH,e.projected_d), 
    CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "Count", 
    CONVERT(VARCHAR,CAST((COUNT(DISTINCT e.uniqueid_c)/CONVERT(DECIMAL(10,2),@PRTFTotal))*100 AS DECIMAL(10,2)),1), 
    CONVERT(VARCHAR,SUM(COUNT(DISTINCT e.uniqueid_c)) OVER (PARTITION BY e.level_c),1) 
FROM cd.enrollments e 
WHERE 
    e.program_c = 'PRTF' 
    AND e.projected_d BETWEEN @MINDOS and @MAXDOS 
GROUP BY e.level_c, DATENAME(MONTH,e.projected_d) 

UNION ALL 

SELECT 
    'PRTF' AS "Program", 
    'Total Clients Discharging' AS "Client Response to Treatment", 
    'All', 
    CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "Count", 
    CONVERT(VARCHAR,CAST((COUNT(DISTINCT e.uniqueid_c)/CONVERT(DECIMAL(10,2),@PRTFTotal))*100 AS DECIMAL(10,2)),1), 
    CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "YTD" 
FROM cd.enrollments e 
WHERE 
    e.program_c = 'PRTF' 
    AND e.projected_d BETWEEN @MINDOS and @MAXDOS 

ResultSet

Idéalement je voudrais qu'il montre quelque chose comme ça, dans cet ordre:

PRTF - Insignificant Success - July - 0 - 0.00 - 0 
PRTF - Insignificant Success - August - 0 - 0.00 - 0 
PRTF - Mild Success   - July - 0 - 0.00 - 0 
PRTF - Mild Success   - August - 0 - 0.00 - 0 
PRTF - Moderate Success  - July - 1 - 25.00 - 1 
PRTF - Moderate Success  - August - 0 - 0.00 - 1 
PRTF - Significant Success - July - 2 - 50.00 - 3 
PRTF - Significant Success - August - 1 - 25.00 - 3 
PRTF - Total Clients   - All - 4 - 100.00 - 4 

Quelqu'un peut m'aider?

Répondre

0

Vous pouvez utiliser des sous-requêtes pour injecter le nombre de mois et d'un ordre de tri pour gérer le tri des en-têtes, corps et pied de page. Les sous-requêtes seraient toujours combinées avec UNION ALL, mais cela vous permet de sélectionner uniquement les colonnes pertinentes du jeu de résultats tout en donnant des métadonnées pour le tri.

-- Load headers with sub-query to hide sort order attribute 
SELECT 
    [Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD] 
FROM (
    SELECT '', '', '', '', '', '', 10, 0 -- SortOrder, MonthOrder 
    UNION ALL SELECT 'PRTF', 'Client Response To Treatment', 'Month', 'Count', 'Percentage', 'YTD', 20, 0 -- SortOrder, MonthOrder 
) Headers ([Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD], SortOrder, MonthOrder) 

UNION ALL 

-- Load records with sub-query to hide sort order attribute 
SELECT 
    [Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD] 
FROM (
    SELECT 
     'PRTF' AS "Program", 
     CASE 
      WHEN e.level_c IS NULL THEN 'None Entered' 
      WHEN e.level_c = '' THEN 'None Entered' 
      WHEN e.level_c = 'SIG' THEN 'Significant Success Experienced' 
      WHEN e.level_c = 'MOD' THEN 'Moderate Success Experienced' 
      WHEN e.level_c = 'MILD' THEN 'Mild Success Experienced' 
      WHEN e.level_c = 'INS' THEN 'Insignificant Success Experienced' 
      ELSE e.level_c END AS "Success", 
     DATENAME(MONTH,e.projected_d), 
     CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "Count", 
     CONVERT(VARCHAR,CAST((COUNT(DISTINCT e.uniqueid_c)/CONVERT(DECIMAL(10,2),@PRTFTotal))*100 AS DECIMAL(10,2)),1), 
     CONVERT(VARCHAR,SUM(COUNT(DISTINCT e.uniqueid_c)) OVER (PARTITION BY e.level_c),1), 
     30, DATEPART(MONTH,e.projected_d) -- Add SortOrder, MonthOrder 
    FROM cd.enrollments e 
    WHERE 
     e.program_c = 'PRTF' 
     AND e.projected_d BETWEEN @MINDOS and @MAXDOS 
    GROUP BY e.level_c, DATENAME(MONTH,e.projected_d) 
    ) Records ([Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD], SortOrder, MonthOrder) 

UNION ALL 

-- Load footer with sub-query to hide sort order attribute 
SELECT 
    [Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD] 
FROM (
    SELECT 
     'PRTF' AS "Program", 
     'Total Clients Discharging' AS "Client Response to Treatment", 
     'All', 
     CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "Count", 
     CONVERT(VARCHAR,CAST((COUNT(DISTINCT e.uniqueid_c)/CONVERT(DECIMAL(10,2),@PRTFTotal))*100 AS DECIMAL(10,2)),1), 
     CONVERT(VARCHAR,COUNT(DISTINCT e.uniqueid_c),1) AS "YTD", 
     40, 0 -- Add SortOrder and month order 
    FROM cd.enrollments e 
    WHERE 
     e.program_c = 'PRTF' 
     AND e.projected_d BETWEEN @MINDOS and @MAXDOS 
    ) Footers ([Program],[Measurement],[Month],[Count or Total],[Percentage or Average],[YTD], SortOrder, MonthOrder) 

ORDER BY 
    SortOrder, [Program], [Measurement], [MonthOrder] 
+0

Vous êtes l'homme, Jason. Je vous remercie. – ct253704

+0

S'il vous plaît upvote/accepter la réponse si elle résout la question pour le bénéfice d'autres personnes confrontées à un problème similaire à l'avenir. –