2016-06-13 1 views
1

SSRS를 통해 고유 한 레코드를 얻으려고하고 쿼리가 아니라 별개의 값을 기반으로 데이터를 합치려고합니다. SSRS 데이터 집합 내부에 저장된 proc을 실행하여 데이터를 가져옵니다. 아래는 결과입니다 :별개의 값을 얻은 다음 그 값으로 그룹화하는 방법은 무엇입니까?

Company ProductID PayeeID PayeeName GroupID Profit 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1a  $30 
ABC  123  1  Brenda  1b  $30 
ABC  456  2  Diana  2a  $45 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

고유 한 회사, 제품, 수취인 및 그룹 ID가 아닌 그룹 및 합계 이익이 필요합니다. 중복 된 그룹 ID가 있음을 알 수 있습니다. 나는 그것의 별개의 기록을 원한다. 나는 SSRS에 설치하는 모든 그룹을 가지고 있지만 나의 결과는 SSRS에서 아래와 같이 게재되는 그룹 ID에 대한 그것을 구별하는 방법을 모르는 : 중복 그룹 ID

Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $90  =(1a+1a+1b) 
ABC  456  2  Diana  $90 
ABC  789  3  Jonathan $92 

**해야하지 SUM 값을

내가 원하는 것은 :

Company ProductID PayeeID PayeeName Profit 
ABC  123  1  Brenda $60  =(1a+1b) 
ABC  456  2  Diana  $45 
ABC  789  3  Jonathan $46 

** 중복 값

SSRS에서이 작업을 수행하는 방법에 대한 어떤 생각이 아니라 쿼리 수준에 합산하지? 내가 쿼리 수준에서 원하지 않는 이유는 테이블을 만들고, proc을 실행하고, 내가 만든 테이블에 데이터를 저장해야하기 때문입니다. 미래에 저장된 proc 구조체가 수정 되었다면, 두 곳에서 보고서를 수정해야 할 것입니다. 어떤 도움을 주시면 감사하겠습니다.

답변

2

다음과 같은 시도 할 수 있습니다 : 그것은 허용의 경우

SELECT Company, ProductID, PayeeID, PayeeName, SUM(Profit) as Profit 
FROM (SELECT DISTINCT * FROM Table_1) as t 
GROUP BY Company, ProductID, PayeeID, PayeeName; 
0

1), I 따라서 같은 저장 프로 시저 내에서이 새로운 컬럼의 값을 계산 할 것은 : 기본적으로

SELECT a.*, 
    SUM(CASE WHEN RowNum = 1 THEN Profit END) 
    OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID) AS SumOfProfit 
FROM (
    SELECT ..., -- Plus one more column 
     ROW_NUMBER() OVER(PARTITION BY a.Company/*or CompanyID ?*/, ProductID, PayeeID, GroupID ORDER BY @@SPID) AS RowNum 
    FROM ... final query from stored procedure ... 
    .... 
) a 

이 추가됩니다 원래 데이터 세트에 새로운 열 (SumOfProfit) (!)

Company ProductID PayeeID PayeeName GroupID Profit SumOfProfit 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1a  $30 60 
ABC  123  1  Brenda  1b  $30 60 
ABC  456  2  Diana  2a  $45 ... 
ABC  456  2  Diana  2a  $45 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3a  $23 
ABC  789  3  Jonathan 3b  $23 
ABC  789  3  Jonathan 3b  $23 

2) 제 2 용액은 t이며 O 변환 ( 가능한 경우), 사용자 정의 기능

  • 다단계 UDF 함수에 저장 절차는 단지 하나의 라인을 가지고 있다면 (또는
  • 인라인 UDF 기능 (2 명 이상의 선이있는 경우); {인라인 | 한 줄} 때때로에 멀티 라인 저장 프로 시저를 변환 할 수 있습니다 기능)

이와 나는 이렇게 저장 프로 시저를 바꿀 것 :주의

ALTER PROCEDURE ... 
AS 
BEGIN 
    SELECT f.... 
    FROM dbo.UserDefinedFunction(...) f 
    -- ORDER BY ... ? 
END 

을이 보고서를 위해 나는 것 (I 솔루션 1과 2는 적용되지 않습니다 및 if initial stored procedure don't include insert into another table이, 두 번째 보고서 우리는 따라서 첫번째 저장 프로 시저를 다시 사용할 수있는 경우,

SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM dbo.UserDefinedFunction(...) f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 

3) 물론 : 다음 조회/저장 프로 시저 (데이터 소스로) 사용)이 방법을 좋아하지 않는다 :

CREATE TABLE #Results (
    Company ..., 
    ProductID INT, 
    PayeeID INT, 
    ... 
) 
INSERT #Results (...) 
EXEC dbo.FirstStoredProcedure (...) 
-- and then 
SELECT s.Company, s.ProductID, s.PayeeID, SUM(Profit) AS SumOfProfit 
FROM (
    SELECT DISTINCT f.Company, f.ProductID, f.PayeeID, f.GroupID, f.Profit 
    FROM #Results f 
) s 
GROUP BY s.Company, s.ProductID, s.PayeeID 
+0

참고 : 본인은 SSRS 전용 솔루션이 아니라고 알고 있습니다. –

0

을 여기 순수한 SSRS 솔루션입니다하지만 그것은 매우 추한 불필요한 복잡하다.이 솔루션은 재미로 만들어졌습니다. 따라서 은 큰 데이터 세트에 대해이 접근법을 사용하지 않는 것이 좋습니다. T-SQL 레벨 솔루션을 강력히 추천합니다. 당신은 내가 다음과 같은 테이블 릭스를 만들어 게시 된 데이터 세트를 기반으로

:

enter image description here

내가 열 가시성 창을 사용하여 마지막 열 (자세한 열) 숨긴.

enter image description here

사용하여 사용자 지정 코드는 VB 코드를 사용하여 SSRS 기능의 기능을 확장 할 수 있습니다. Report 메뉴/Report properties...으로 이동하여 Code 탭으로 전환 한 다음 텍스트 영역에 다음 코드를 입력하십시오. 선택한 셀에서

Public Function MySum(ByVal groups as Object(), ByVal values as Object()) As Integer 
Dim found_groups As System.Collections.ArrayList=New System.Collections.ArrayList() 
Dim n as Integer 
Dim sum as Integer = 0 
For n = 0 To groups.Length-1 
    If not found_groups.Contains(groups(n)) Then 
     found_groups.Add(groups(n)) 
     sum = sum + values(n) 
    End If 
Next 
Return sum 
End Function 

(테이블 릭스의 스크린 샷을 확인) 나는이 표현을 사용했습니다의 MySum() 함수는 정수를 인수로 두 배열을 반환의 합을

=Code.MySum(Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!GroupID.Value), 
"DataSet1" 
), 
Lookupset(
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
Fields!ProductID.Value &"-"& 
Fields!PayeeID.Value &"-", 
CStr(Fields!Profit.Value), 
"DataSet1" 
)) 

주 주어진 그룹의 값은 Profit입니다.

주의

enter image description here가 : 데이터 구조가 변경되는 경우이 솔루션은 질문에서 제공하는 데이터 세트를 기반으로 만들어진, 그것은 작동하지 않습니다

이 이런 일을 미리.

이 정보가 도움이되는지 알려주세요.

관련 문제