2016-04-28 42 views
3

我有一個SSRS報告,顯示按財年,財季和業務類型分組的總收入。我需要添加最後一列,用於統計構成每行代表單個業務的總收入數字的數字行。如何使用SSRS中的特定數據集進行行計數

基本上我需要知道特定業務類型中有多少個別企業對該時間段內的總數作出貢獻。我將在下面詳細解釋。

首先這裏是存儲過程饋送報告數據:

SELECT 
id 
,assess_year 
,CASE 
    WHEN MONTH(date_received) IN (7,8,9) THEN 1 
    WHEN MONTH(date_received) IN (10, 11, 12) THEN 2 
    WHEN MONTH(date_received) IN (1, 2, 3) THEN 3 
    WHEN MONTH(date_received) IN (4, 5, 6) THEN 3 
    WHEN date_received is null THEN 0 
    ELSE 0 
END as Fiscal_Quarter 
,s_gross_revenue 
,CASE 
    WHEN LEFT(segment, 1) = 'A' THEN 'Accommodations' 
    WHEN segment BETWEEN 'B100' AND 'B699' THEN 'Restaurant' 
    WHEN segment BETWEEN 'B700' AND 'B999' THEN 'Retail' 
    WHEN LEFT(segment, 1) = 'C' THEN 'Attractions/Recreation' 
    WHEN LEFT(segment, 1) = 'D' THEN 'Travel Services' 
    WHEN LEFT(segment, 1) = 'E' THEN 'Rental Cars' 
    WHEN LEFT(segment, 1) = 'N' THEN 'Other' 
    ELSE 'UNDEFINED' 
END as Segement 
FROM mytable 
WHERE s_gross_revenue >0 AND assess_year IS NOT NULL 
    AND assess_year <> '' AND segment IS NOT NULL AND segment <>'' 
ORDER BY ASSESS_YEAR, FISCAL_QUARTER, SEGEMENT 

我附圖像(Raw Data Image)顯示由所述過程返回的原始數據的示例。

我正在按SSRS報告中的年,季度和業務類型進行所有分組。

我只需要一個公式或分組即可計算構成總收入的每個業務的所有行。

我還附上了報告(SSRS Report Image)的圖像,並在行數應該到的末尾的空白列。

因此,在SSRS報告圖像中,2014/15財政年度和財政季度1的業務類型「住宿」在最後一列中應該有4455行計數,因爲有4455個單獨的企業被列爲住宿2014/15年第一季度有收入。我只是不知道如何根據SSRS中的特定標準進行行計數。

(另外,我知道宿舍的SQL看起來很怪異,我們的業務今年七月開始)

+0

'MONTH(date_received)IN(4,5,6)'位應該返回3還是4? – Kidiskidvogingogin

+0

它應該返回一個4.我看到它並糾正它,但只有在我發佈舊代碼後。謝謝,很好。 – ekim110575

+0

您使用的是哪個版本的SQL Server? – Kidiskidvogingogin

回答

1

如果我正確理解你的問題,如果你使用SQL Server 2008+那麼你可以在你的OVER(...)子句在保留詳細數據的同時執行COUNT(...)

對於商務指望它會是什麼樣子:

COUNT(*) OVER (PARTITION BY assess_year, Fiscal_quarter, Segement) 

這裏是完全修改的查詢,但上面的部分是真正唯一的變化:

SELECT 
    id 
    ,assess_year 
    ,Fiscal_Quarter 
    ,s_gross_revenue 
    ,Segement 
    ,COUNT(*) OVER (PARTITION BY assess_year, Fiscal_quarter, Segement) BusinessCount 
FROM (
     SELECT 
      id 
      ,assess_year 
      ,CASE 
       WHEN MONTH(date_received) IN (7,8,9) THEN 1 
       WHEN MONTH(date_received) IN (10, 11, 12) THEN 2 
       WHEN MONTH(date_received) IN (1, 2, 3) THEN 3 
       WHEN MONTH(date_received) IN (4, 5, 6) THEN 4 
       WHEN date_received is null THEN 0 
       ELSE 0 
      END as Fiscal_Quarter 
      ,s_gross_revenue 
      ,CASE 
       WHEN LEFT(segment, 1) = 'A' THEN 'Accommodations' 
       WHEN segment BETWEEN 'B100' AND 'B699' THEN 'Restaurant' 
       WHEN segment BETWEEN 'B700' AND 'B999' THEN 'Retail' 
       WHEN LEFT(segment, 1) = 'C' THEN 'Attractions/Recreation' 
       WHEN LEFT(segment, 1) = 'D' THEN 'Travel Services' 
       WHEN LEFT(segment, 1) = 'E' THEN 'Rental Cars' 
       WHEN LEFT(segment, 1) = 'N' THEN 'Other' 
       ELSE 'UNDEFINED' 
      END as Segement 
     FROM mytable 
     WHERE s_gross_revenue > 0 
      AND ISNULL(assess_year,'') <> '' 
      AND ISNULL(segement,'') <> '' 
    ) data 
ORDER BY ASSESS_YEAR, FISCAL_QUARTER, SEGEMENT 

我也做了一個輕微的語法改變你的where子句,這是相同的邏輯,但它是一種速記方式。如果SEGEMENTASSESS_YEAR是文本類型值,則可以將它們組合成ISNULL(...,'') <> '',否則將不得不使用COALESCE(...)來完成相同的操作。如果優選的話,ISNULL(...)可以用COALESCE(...)代替。

這也完全可以通過在您的SSRS報告的id列中使用count(<field name>)來完成。它應該給你相同的結果。

+0

非常好。正是我在找什麼。我很感激幫助。 – ekim110575

+0

@ ekim110575盡我所能幫助我。 – Kidiskidvogingogin

相關問題