레이블이 SSRS인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SSRS인 게시물을 표시합니다. 모든 게시물 표시

2022년 6월 20일 월요일

[SSRS] Line Break Expression

SSRS의 텍스트 표현식에서 \n(줄바꿈)을 입력해줘야 할때

Environment.NewLine 을 입력해준다.

vbcrlf 를 입력해주라는 글도 있지만 명확하게 알 수 있는 Environment.NewLine 이 더 좋은 것 같다.


출처


2021년 1월 15일 금요일

[SSRS] 텍스트 특정 글자 색깔만 변경하기

SSRS 버전: Microsoft SQL Server Reporting Services Designers Version 14.0.1016.268

SQL 버전: SQL 2017 Standard


기존 SSRS에서 텍스트 컬러를 변경 하려면 보통 SSRS에서 제공하는 속성의 Font에서 수식을 이용해 수정했다.

전체 컬러의 색깔만 변경해야 할 때는 해당 방법이 매우 유용했다. 

RS에서 수식을 활용해서 경우에 따라 색깔을 다르게 사용할 수 있었다.


그런데 특정 부분만 색깔을 변경해야 하면 어떻게 해야 할까?

예를들면

나는 오늘 월급을 받았다. 의 월급이라는 글자만 컬러를 변경하고 싶을때

나는 오늘 월급을 받았다. 이런식으로 말이다.


참고한 블로그

1. 텍스트에서 글자부분의 속성을 HTML-Interpret HTML tags as styles를 선택

2. Values에 Expression창을 선택해 HTML태그를 이용해 작성 해주면 된다.


내 경우 2번의 방법이 적용되지 않았다.

그래서 SQL에서 데이터를 가지고 올 때부터 HTML 태그를 붙여서 가지고 왔다.


결과물은 아래와 같다.


증가는 파란색, 감소는 빨간색 부분에 HTML 태그를 넣어주었다.
예상대로 SSRS에서 HTML렌더링을 해준다.





2020년 8월 25일 화요일

[SSRS] Date Format

 SSRS 속성으로 Date format을 설정하고 웹에서 확인 했을 때 내가 원하는 형식이 아닌경우가 있다.

나는 yyyy-MM-dd 형식을 원해서 설정했으나 배포 후 확인 하면 결과가 다르게 나온다.
이럴 경우 expression에서 강제로 설정해야 한다.

기본적으로 text box의 properties의 format 속성이 아닌 expression에 Format 함수를 이용해서 강제 적용 하는 것이다.

방식은 =Format(Fields!name.Value, "yyyy-MM-dd") 이렇게 사용하면 된다.

출처



2020년 3월 24일 화요일

[SSRS] Error: An error occurred during local report processing

SSRS version :  14.0.600.744

오류: SSRS 사이트에서는 잘 열리지만 로컬에서 확인 하는데 "An error occurred during local report processing" 과 같은 메시지가 뜬다면?

난감하다. 사이트는 잘 열리는데 왜 로컬에서만 열리지 않는가?


다양한 이유가 있겠지만...
Report의 Data Sources를 체크할 필요가 있다.

Report 파일 *.rdl 열기 -> Report Data 메뉴 > Data Sources 폴더 > DB 정보 리스트

간혹 DB의 값이 변경되어 해당 DB 연결정보가 바뀐 경우다. (사실 극히 드물다. 그래서 원인 찾기도 쉽지 않았다!)

해당 DataSource의 연결을 확인하고 DataSets을 불러오니 정상적으로 확인 됐다.

너무 간단해서 팁으로 올리기도 민망함!



2020년 3월 12일 목요일

[SSRS] Report Datasets list Query


SSRS 작업을 하다보면 레포트가 어떤 데이터 셋을 사용하고 있는지 궁금할 때가 있다.
레포트를 열어서 확인하면 되지만.. 열어야 하는 레포트가 많다면??
정말 난감하다.

그래서 찾아봤음. 역시 스택오버플로우는 알고 있다.

링크 참조

쿼리는 아래와 같다.

-- Provided "as is" with no warranties of any kind. User assumes all risks of use.
/* The XML XQuery statements used below ignore namespace so that information can be retrieved
   from multiple RDL versions. */
use ReportServer
;WITH CatalogWithXml AS (
    -- XMLifyies Catalog's Content column.
    /* For report (Type = 2) and shared data source (Type = 5) objects, the image-typed column
       Content stores the XML RDL defining the object. We convert this column to XML so that SQL's
       XML type's functions can be used on it. */
    SELECT *,
         ContentXml = (CONVERT(XML, CONVERT(VARBINARY(MAX), Content)))
    FROM Catalog
),
 
SharedDataSources AS (
    -- Details on uses of shared data sources.
    -- * Unused data sources are ignored.
    -- * ItemID identifies the catalog entry (e.g. report) using the shared data source. It is not
    --   the data source's ID!
    /* Table DataSource contains a row for each data source (embedded or shared) used in each report.
       Its column Name stores the data source name, as defined in the report. Shared data sources are
       defined (RDL XML) in the catalog. Inner joining between these two tables limits this CTE's
       resultset to details on shared data sources because embedded data sources don't have Link-ed
       rows in the catalog. */
    SELECT ds.ItemID,
        SharedDataSourceName = c.Name,
        LocalDataSourceName = ds.Name,
        DataProvider = ContentXML.value('(/*:DataSourceDefinition/*:Extension)[1]''NVARCHAR(260)'),
        ConnectionString = ContentXML.value('(/*:DataSourceDefinition/*:ConnectString)[1]''NVARCHAR(MAX)')
    -- Each DataSource row with a Link value represents a use of a shared data source.
    FROM DataSource ds
        -- Uses the Link value to look up the catalog entry defining the shared data source.
        JOIN CatalogWithXml c ON ds.Link = c.ItemID
),
 
AllDataSources AS (
    -- Details on both embedded & shared data sources *used* by reports.
    /* Embedded data sources are defined in the hosting report's RDL. Shared data sources are
       referenced (but not defined) in this RDL. We extract the relevant details and then join
       to the SharedDataSources CTE to assemble a resultset with details on each data source
       (embedded and shared) used by each report (identified by ItemID). */
    SELECT r.ItemID,
        r.LocalDataSourceName, -- embedded data source's name or local name given to shared data source
        sds.SharedDataSourceName,
        SharedDataSource = CAST ((CASE WHEN sds.SharedDataSourceName IS NOT NULL THEN 1 ELSE 0 END) AS BIT),
        DataProvider = ISNULL(r.DataProvider, sds.DataProvider),
        ConnectionString = ISNULL(r.ConnectionString, sds.ConnectionString)
    FROM (
        SELECT c.*,
                LocalDataSourceName = DataSourceXml.value('@Name''NVARCHAR(260)'),
                DataProvider = DataSourceXml.value('(*:ConnectionProperties/*:DataProvider)[1]''NVARCHAR(260)'),
                ConnectionString = DataSourceXml.value('(*:ConnectionProperties/*:ConnectString)[1]''NVARCHAR(MAX)')
            FROM CatalogWithXml c
                CROSS APPLY ContentXml.nodes('/*:Report/*:DataSources/*:DataSource') DataSource(DataSourceXml)
            WHERE c.Type = 2 -- limit to reports only
        ) r
        LEFT JOIN SharedDataSources sds ON r.ItemID = sds.ItemID AND r.LocalDataSourceName = sds.LocalDataSourceName
),
 
DataSets AS (
    -- Details on data sets used in reports.
    /* Outputs one row per data set used in each report. */
    SELECT ItemID,
        DataSetName = QueryXml.value('@Name''NVARCHAR(256)'),
        DataSourceName = QueryXml.value('(*:Query/*:DataSourceName)[1]''NVARCHAR(260)'),
        CommandType = QueryXml.value('(*:Query/*:CommandType)[1]''NVARCHAR(15)'),
        CommandText = QueryXml.value('(*:Query/*:CommandText)[1]''NVARCHAR(MAX)')
    FROM CatalogWithXml
        CROSS APPLY ContentXml.nodes('/*:Report/*:DataSets/*:DataSet') QueryData(QueryXml)
),
 
Data AS (
    -- Combines data set and data source details with additional information from Catalog.
    SELECT ds.ItemID,
        Name,
        Path,  
        LocalDataSourceName,
        SharedDataSource,
        SharedDataSourceName,
        DataProvider,
        ConnectionString,
        DataSetName,
        CommandType = ISNULL(CommandType, 'Text'), -- "Text" = default command type
        CommandText
    FROM DataSets ds
        JOIN AllDataSources src ON src.ItemID = ds.ItemID AND src.LocalDataSourceName = ds.DataSourceName
        JOIN Catalog c ON ds.ItemID = c.ItemID
)
SELECT * FROM Data

아주 유용하게 사용할 것 같다.

2020년 1월 7일 화요일

[SSRS] Report auto reset


정적인 레포트도 많이 사용되지만 시간의 흐름에 따라 데이터의 변화를 확인하고 싶은 경우도 있다. 데이터의 진행 상황을 확인해야 하는 경우 매번 새로고침을 누르지 않아도 가능한 기능이 있다.

레포트 데이터의 변화를 확인 하기 위해 주기적으로 자동 새로고침을 적용하고 싶을 때 사용한다.

Report 속성 > AutoRefresh 값을 변경한다.

0: 새로고침 없음
10: 10초마다 새로고침


옵션 값의 단위는 s이다. 레포트 속성을 찾기 힘들다면 레포트의 properties 창에서 Report를 선택하자.

기록하지 않으면 잊을 것 같아 블로그에 작성한다.



2019년 7월 3일 수요일

[SSRS] Report View Error 0x80030050

SSRS 서비스에서 0x80030050 에러 발생 시 해결 방법 입니다.

증상: 잘 보였던 레포트가 Visual Studio 비정상 종료 이후 보이지 않았습니다.

버전: Visual Studio Professional 2015
에러번호: 0x80030050

해당 에러 문구가 나타났고, 구글링을 통해 찾아봤다.

에러 화면... 당황스럽다.. 분명 잘 나왔던 레포트인데..


우선은 SSRS 서비스를 재시작 해줬다. 혹시? 될까봐...
하지만 해결되지 않았다. 다시 찾아봤다.

해결 방법 링크를 통해 찾았다. 보려고 하는 레포트의 reportname.rdl.data 파일을 삭제하고 다시 확인 해보라는 것이었다.
프로젝트 패키지 경로를 찾아가서 내가 보고자 하는 레포트의 .data 파일을 삭제 했다.


결과는 해결입니다.
오늘도 stack overflow의 도움을 크게 받았습니다. 사실 어제 퇴근 시간에 안되서 아침에 오면 되겠지 하고 왔는데 안되서 당황스러웠는데 빨리 해결됐다.

위와 같은 에러가 발생하면 참고하길 바랍니다.




2019년 7월 2일 화요일

[SSRS] Refer ReportItems

SSRS에서 각 셀들은 이름을 가지고 있다. 이 이름들은 SSRS의 객체이며, 이것들을 참조하여 값을 출력하거나 식에 활용할 수 있다.

관련링크

사용방법

= ReportItems!TextBoxList1.Value

TextBoxList1이 객체의 이름이 되는데 이 이름들을 활용하여 여러 상황에 적용 가능

사용예시
* 텍스트 컬러 변경
숫자를 사용하는 레포트에서 양수와 음수를 구분하는 경우가 많다.
FontColor 속성의 Expression
= IIF(ReportItems!TextBoxList1.Value < 0 ,"Red","Black")

* 각 객체끼리의 합
= ReportItems!TextBoxList1.Value + ReportItems!TextBoxList2.Value

위와 같이 객체 내의 Value에 대해서도 계산이 가능하다.
활용 방법만 알고 있으면 다양하게 사용 가능하니 참고해두도록 하자.



2019년 4월 23일 화요일

[SSRS] Input Parameter Null

서비스: SSRS
버전: SQL Report Server 2016 


SSRS에서 Parameter에 NULL값을 넘겨 주는 방법
선택형 Parameter는 NULL을 넘겨주고 싶은데 NULL이라고 쓰면 문자열을 그대로 인식한다.
찾아보닏 expression 옵션에서 아래와 같이 입력하면 된다.

= system.dbnull.value

이렇게 하면 NULL을 넘겨줄 수 있다.

자주 쓰이지는 않지만 Nothing 이라고 하는 것 보다는 명시적으로 NULL을 넘겨주는 것이고, 문자열로도 인식하지 않기때문에 알아두면 좋을 것 같다.

2019년 4월 22일 월요일

[SSRS] The definition of the report is invalid

서비스: SSRS
버전: SQL Report Server 2016 

1. 증상 SSRS 레포트는 정상 출력 확인 됨

2. Row별로 =IIF(Rownumber(Nothing) Mod 2 =1 , "White","WhiteSmoke")로 변경하고자 하는데 특정 컬럼에서만 the definition of the report 'reportname' is invalid 에러가 발생

3. 사유 해당 Table 혹은 Matrix에서 다른 컬럼과 중복이 발생하면 에러가 발생한다.

4. 변경방법 해당 컬럼의 컬럼명을 바꾸어준다. 다른 DataSet의 컬럼과 중복되면 안됨.

5. 해당 Textbox의 이름도 변경 해줘야한다.

5번의 원인을 못 찾아서 시간을 많이 허비했다.
SSRS에서는 중복 때문에 에러가 많이 발생한다. 그러므로 중복 없이 컬럼명, 데이터 셋, 그룹명을 만들지 않도록 항상 주의해야 한다.

2018년 9월 21일 금요일

[SSRS] IIS 세팅 시 0x8007000d 오류

웹 개발은 대학교 이후로 해본 적이 없었는데 SSRS 서버와 Web을 연동하면서 생긴 오류 해결 과정을 적어보고자 한다.

SSRS에 웹 홈페이지에서 보이도록 하기 위해 기존에 라이브로 사용하던 Web소스를 수정해서 넣었다.
그런데. 접속을 하면 500.19 에러가 계속 발생했다. IIS 세팅이 잘못된 것인지 생각 되어 해당 사이트의 속성값들을 확인하려고 해도 경고창과 함께 0x8007000d 오류 메시지가 나왔었다.

사실 처음에는 xml 문법을 틀려서 진행이 되지 않았는데 IIS에서 세팅을 확인하려고 해도 \\.\경로\web.config 파일의 에러라고 나오면서 아무것도 수행이 되지 않았다. IIS를 모두 지우고 재설치를 해도 여전히 같은 상황 이었다.

찾아보니 URL Rewrite 기능 문제였다. 내가 붙인 web.config에 URL Rewrite 기능을 사용하고 있는데 서버에 설치가 되어 있지 않았던 것이 문제였다. web.config파일을 열어 rewrite를 검색해보니 해당 값이 설정 되어있었다.


URL ReWrite 다운로드를 통해 설치 파일을 얻을 수 있으며, 자신이 사용하는 서버가 외부와 연결이 되지 않는다면 아래 쪽에 오프라인 전용 설치 파일도 있다.
관련해서 이제 500.19 에러는 나지 않지만 여전히 접속은 안된다.
이제 또 다른 해결 방법을 찾아 봐야겠다.

[SSRS] 레포트 Job name 확인하기

SSRS 레포트를 구독 등록을 하면 SQL Server Agent에 Job으로 등록 된다.
정상적인 이름으로 등록이 되면 참... 좋겠지만 알 수 없는 문자로 등록되어 혼란을 일으킨다.
가령 2CEXXX-7EXXX-XXXXX 이런식이다.

단순히 JOB을 잠시 disable 해야 할 경우 난감하다.
일일이 찾아보는건 정말 시간 낭비...

그래서 찾아보았다.
DB에 저장을 하고 있을 테니 해당 Job을 찾을 수 있을테지...

쿼리는 다음과 같다.

USE Reportserver
GO
 
SELECT 
c.Name AS ReportName
, c.Path AS Report_path
, rs.scheduleID as Job_name
, s.Description
, s.LastStatus
, s.LastRuntime
FROM catalog c
JOIN Subscriptions s ON c.ItemID = s.Report_OID
JOIN ReportSchedule rs ON c.ItemID = rs.ReportID
AND rs.SubscriptionID = s.SubscriptionID

ReportName은 만들어진 레포트 명
Report_Path는 레포트가 있는 경로
Job_name은 SQL Server Agnet의 Jobs에 등록되어있는 이름
Description은 레포트 서버에서 등록했던 Job의 내역

이 정도를 알 수 있다.

SSRS에서 구독 목록이 몇개 없다면 굳이 저 쿼리를 쓰지는 않아도 될 것이다.
하지만 일을 좀 더 효율적으로 할 수 있다면 바로 바로 정리해서 사용하는 것도 나쁘지 않을 것 같다.

[SSRS] 중복 텍스트 박스 이름으로 에러 발생

같은 레포트 내에 같은 표 내에서 같은 이름의 컬럼을 가지고 있으면 처음부터 Datasets에서 데이터를 가지고 오지 못한다. 이런 경우는 에러를 바로 확인 할 수 있지만 동일한 레포트 내에 같은이름의 Textbox이름을 가진 경우 에러가 발생할 수 있다.

내 경우는 처음에는 정상 출력 되었으나 라인별로 컬러를 세팅하다가 확인 되었다.
정상적으로 출력되다가 에러가 발생해서 처음에는 갸우뚱 했다. 
에러는 보통 다음과 같이 출력되며, 해당 에러는 다른 사람의 에러를 가지고 온것이다.

Error 1 [rsUnexpectedCompilerError] An unexpected error occurred while compiling expressions. Native compiler return value: ‘[BC30179] class 'Textbox1_TextBoxExprHost' and class 'textbox1_TextBoxExprHost' conflict in class 'ReportExprHostImpl'

해결방안도 확인을 해보면 동일한 텍스트 박스를 가진 객체들의 이름을 변경하는 것이다. 보통의 경우 대소문자를 구분하는데 객체의 이름은 대소문자를 구분하지 않는 것 같다. 실제로 표현 식에 그룹명이나 데이터셋의 이름을 넣을 경우 대소문자를 구분해서 출력이 안되는 경우가 몇 번 있었다. 그러나 이번에는 구분을 하지 않아서 발생하는 에러인것이다. 

사소하지만 이런 에러 발생하면 원인을 몰라 당황할 때가 많으니 참고는 해두자.

[SSRS] 정렬을 특정 컬럼 기준으로 하기

레포트 발행을 하면서 특정 항목들을 묶어서 보고 싶을 때가 있다.

가령 데이터가
a
b
c
d

이렇게 정렬 되어있는 것을

c
a
b
d

이렇게 c만 맨 위에 위치하도록 보고 싶을 때가 있다.
내 경우 정산 아이템이 구매, 환불 쌍으로 이루어져 있어서 해당 아이템을 함께 볼 수 있었으면 하는 요구가 있었다. SQL의 output 자체 정렬을 변경할까 SSRS에서 변경을 할까 찾아보다가 SSRS에서 변경하는 것이 나을 거 같아서 해당 방법으로 진행하기로 했다.

참고링크:  Stack Over Flow

1. 해당 작업은 Row그룹을 기준으로 작성했다.
2. RowGroup에서 Group Properties 클릭
3. Sorting 메뉴 선택
4. 현재 정렬 방식이 없다면 Add 있다면 fx 버튼 클릭
5. = IIF(Fileds!Test.Value = XXX, "A", "B")
  여기서 Test는 특별히 맨 위에서 보고싶은 값을 가진 컬럼의 이름이며 XXX는 특정 값에 해당한다. 
  
꼼수같아 보일 수 있지만, SQL을 수정하는 것보다는 SSRS를 수정하는 것이 낫다는 판단이 될 때 해당 방법을 사용할 수 있다.

[SSRS] Matrix에서 LineNumber확인하기

레포트를 만들 때 데이터가 많아서 가독성을 높이기 위해 표의 데이터를 Row별로 컬러를 다르게 해준다.
보통 Table의 경우 크게 문제가 되지 않지만 Matrix의 경우에는 복잡하다. (적어도 내 기준에서는 어려웠다..ㅠㅠ)
여러 방법을 시도해서 실패했고, 내가 원하는 결과를 도출한 내용을 공유한다.

해당 방법은 레포트의 로딩속도가 느려질 수 있으니 반드시 테스트 해보자.

= (RunningValue(Countdistinct("그룹명"), count, "그룹명")

해당 값을 출력해보면 row가 데이터의 유무에 관계 없이 rownumber가 순차적으로 증가함을 확인할  수 있다.
이를 응용해서 셀의 컬러를 채우는 것이다. 여기서 그룹명은 column의 그룹명이다.

=IIF(RunningValue(Countdistinct("그룹명"), count, "그룹명"), mod 2 =1, "White","Gainsboro")

해당 방법으로 진행해서 현재 레포팅 발행하고 있다.
다행이 속도가 느리지는 않다.
반드시 레포트 로딩속도를 체크하자.

[SSRS] Data Source로 Mysql 연결하기

SSRS Data Source에 Mysql 연결하기

1. MySQL Connector/ODBC를 설치한다. 32bit, 64bit 맞게 설치한다.
   ODBC 다운로드 링크
2. 제어판>관리도구>ODBC 데이터 원본(32/64비트) 더블클릭한다.
3. 사용자 DSN에서 추가 >드라이버 선택, 이 때 1번이 정상적으로 설치 되었으면 리스트에 Mysql 이 나온다.
4. 선택을 하고 마침을 클릭하면 연결 설정이 나온다.
5. Data Source Name에는 이름을 써준다.
6. TCP/IP Server에  IP 주소와 Port를 기입한다.
7. User, Password 를 기입한다.
8. 이 때 정상적으로연결되면 Database항목에 접근할 수 있는 DB의 리스트가 보인다. 접속할 DB 선택 후     Test 버튼을 클릭한다. 정상일 경우 성공 메시지가 뜨고, OK 버튼을 클릭한다.
9. SSRS 를 열고 Shared Data Source 에서 우클릭을 한 뒤 Add New Data Source를  클릭한다.
10. Type을 ODBC로 선택하고 Edit 을 클릭하면 추가할 수 있는 Mysql 연결이 보인다. 이때 이 연결 사항은 5.과정에서 적은 이름을 리스트에서 확인 할 수 있다.
11. Login information에서 접속할 계정/패스워드를 넣고 Test Connection 을 통해 연결 테스트를 다시 확인한다.
12. 완료 !! 이제 SSRS에서도 Mysql의 데이터를 확인할 수 있다.

[SSRS] Line Chart Empty Value 처리

1. 게임의 CCU정보와 같이 시간의 흐름에 따른 연속적인 데이터를 가지고 옴
2. Value에 데이터가 빠져있음.
3. RS로 그래프를 그리면 끊기는 모양으로 출력된다. 당연한 이야기다. 데이터가 없기 때문에!!!
4. 방법 출처 docs.microsoft.com

우선 해당 방법은 chart 속성의 Emptynode 에서 컬러를 지정 
> 해당 노드  내에 marker node에서도 색깔 지정 
> CustomAttributes에서 EmptyPointvalue의 값을 ZERO라고 해두었는데 이렇게 할 경우 그래프가 끊긴다.

내가 작성한 레포트의 경우 오늘, 어제, 일주일 전의 데이터를 모두 가지고 와야 했으므로 Series의 그룹도 있는 상황이라서 해당 방법을 적용하기에는 무리가 있었다.
그래서 CustomAttributes에서 EmptyPointvalue의 값을 AVG(데이터셋의필드)로 설정해주었다.

뭐든 자신이 만든 레포트에 맞게 설정하는 것이 중요하다.
내가 만든 레포트의 경우에는 ZERO로 하는것이 사용자가 원하는 것이 아니었으므로 이러한 방법을 사용했다.

내가 만든 레포트는 게임 CCU 그래프를 전일, 일주일 전 데이터로 비교를 하는 것이었기 때문에 해당 방법으로 진행하였다.

[SSRS] 다른 Data set 데이터 참조하기

데이터를 출력해야 하는데 가지고 오는 것은 No 이지만 출력은 코드 테이블에서 가지고 오고싶다.
이미 하나의 Data set에 다른 Data set을 가지고 오기 위해 함수를 찾아봤다.
LookUp 함수를 사용하면 된다.

사용방법은 다음과 같다.
Dataset1 / Dataset2 일 때 Tablix Or Matrix에 Dataset1이 설정 되어있을 때
DataSet2의 컬럼 값이 필요하다.

= Lookup(Fields!Dataset1column1.Value, Fields!Dataset2column1.Value, Fields!Dataset2column2.Value, "Dataset2")

 이렇게 하면 Dataset2의 데이터를 가지고 올 수 있다. 
Fields!Dataset1column1.Value = Fields!Dataset2column1.Value 일 경우
Fields!Dataset2column2.Value의 값을 호출 하는 것이다.
Inner Join과 같다고 생각하면 이해가 쉬울 것 같다.


[SSRS] 그룹별 RowNumber 확인하기

레포트 작성 시 RowNumber 혹은 RunningValue 함수를 많이 사용한다.
해당 함수는 아직까지는 셀의 화면 색을 무슨 색으로 채울지 설정할 때 많이 사용했다.
보통 식은 다음과 같다.

= IIF(RowNumber(Nothing) Mod 2, "White","Gainsboro")

홀/짝 Rownuber에 따라 컬러를 다르게 하겠다는 의미이다.
최하위 그룹은 해당 함수 만으로도 적용이 가능하다. 하지만 상위그룹은 해당 함수가 적용되지 않는다.
그래서 찾은 방법이

=IIF(RunningValue(Countdistinct("GroupName"), count,Nothing) Mod 2, "AliceBlue","LavenderBlush")

처음에 
=RunningValue(Countdistinct("GroupName"), count,Nothing) 
값은 1, 2, 3 ...   N 까지 정상이 출력이되는 것을 확인하고  FILL Expression에 적용한 것이다.

해당 함수 인자 값 중 count 를 countdistinct로 변경하면 1만 출력된다.
SSRS 작업을 하면서 비슷하지만 다른 기능을 가진 함수들이 많이 있는데 이런 경우를 대비해 정리를 하는 것이 필요할 것 같다.