2017-07-24 15 views
2

早上好,劃分和排序在多聯報表

我爲我們的團隊儀表板許多指標組合成他們可以複製到Excel中,然後讓數據透視表做一些神奇的一個可執行的存儲過程的工作。這就是說,爲了這個問題,我只會引用單個較小的數據集來保持簡單。 他們想要標題和標籤的方式非常具體,所以這就是爲什麼第一對套書寫的方式。如果需要,我可以提供更多信息。

這裏是我想知道的問題,如果有人可以幫助我:

  1. 他們希望在查詢中的放電月份名稱。這很好,但是一旦我將排除日期(projected_d)添加到查詢中,我還必須使用group by。這會導致沒有數據的任何MonthMeasure從結果集中完全消失。我想爲這條線顯示一個零而不是消失。如果我從查詢中刪除monthgroup by,零將顯示。

  2. 由於Union All,我不能使用MonthsORDER BY聲明。 我想在結果集中顯示月份名稱,但按MONTH編號排序。在普通查詢中,我通常不會遇到問題,但由於此查詢中的Union All s,我在解決該問題的方式或方式方面存在問題。

下面是當前查詢和結果集:

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

理想我想它顯示這樣的事情,在這個順序:

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 

誰能幫我嗎?

回答

0

您可以使用子查詢來注入月份編號和排序順序來處理頁眉,正文和頁腳的排序。子查詢仍然會與UNION ALL結合使用,但它允許您在給予使用元數據進行排序時僅選擇結果集的相關列。

-- 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

你是男人,傑森。謝謝。 – ct253704

+0

如果爲將來面臨類似問題的其他人的利益解決問題,請致信/接受答案。 –