2017-04-21 1 views
0

이것은 내가 테이블을 얻는 방법입니다.SSRS 매트릭스 테이블 보고서. 병합 행

+------+---------+-----------+---------+ 
| Cstmr| morning | afternoon | night | 
+------+---------+-----------+---------+ 
| ab | N/A  | N/A  | car | 
|  | N/A  | N/A  | 11pm | 
|  | bike | N/A  | N/A | 
|  | 9am  | N/A  | N/A | 
|  | N/A  | cycle  | N/A | 
|  | N/A  | 2pm  | N/A | 
| ac | N/A  | N/A  | car | 
|  | N/A  | N/A  | 11pm | 
|  | bike | N/A  | N/A | 
|  | 9am  | N/A  | N/A | 
+------+---------+-----------+---------+ 

이렇게 표시하고 싶습니다.

+------+---------+-----------+---------+ 
| Cstmr| morning | afternoon | night | 
+------+---------+-----------+---------+ 
| ab | bike | cycle  | car | 
|  | 9am  | 2pm  | 11pm | 
| ac | bike | N/A  | car | 
|  | 9am  |   | 11pm | 
+------+---------+-----------+---------+ 

Cstmr은 고객입니다. 아침 : 오전 6시 - 오후 12시. 오후 : 12 pm-10pm. 밤 : 10 pm-6am. 고객 'ab'의 경우 자전거는 오전 9시에, 자전거는 오후 2시에, 자전거는 오후 11시에 제공됩니다. 시간에 따라 데이터는 각 열에 표시되어야합니다. 그 시간에 차량이 제공되지 않으면 N/A가 표시되어야합니다.

And this is how parent and child groups are formed.

+2

좋은 질문입니다. 이제는 다양한 가치들이 서로 어떻게 관련되어 있는지 알려주세요. 그리고 아마도 당신은 대답을 얻을 것입니다. –

+1

Cstmr은 고객입니다. 아침 : 오전 6시 - 오후 12시. 오후 : 12 pm-10pm. 밤 : 10 pm-6am. 고객 'ab'의 경우 자전거는 오전 9시에, 자전거는 오후 2시에, 자전거는 오후 11시에 제공됩니다. 시간에 따라 데이터는 각 열에 표시되어야합니다. 그 시간에 차량이 제공되지 않으면 N/A가 표시되어야합니다. – user7814194

+0

"SSRS"를주의하는 것을 잊어 버렸습니다. 보고서에서 내 접근 방식은 다를 수 있습니다. – KumarHarsh

답변

0

IMHO,이 데이터가 전혀 정상화되지 않은보기의 프로젝트 관점에서 좋은 질문은? 어떻게되어 있습니다.

두 번째로 "이것은 내가 테이블을 얻는 방법입니다." 이것은 실제 테이블이 또는이 쿼리를 통해 얻은 결과 집합입니다.

셋째, 다른 샘플 데이터로이 스크립트를 시험해보고 문제점을 알려주십시오. 위 스크립트가 정확하지만 느린 경우 모든 비즈 니스 요구 사항에 대해 페이징을 적용 할 수 있습니다.

declare @t table(Cstmr varchar(20),morning varchar(20) 
,afternoon varchar(20), night varchar(20)) 

insert into @t VALUES 
('ab','NA','NA','car') 
,(null, 'NA','NA','11pm ') 
,(null, 'bike','NA','NA ') 
,(null, '9am','NA','NA ') 
,(null, 'NA','cycle','NA ') 
,(null, 'NA','2pm','NA ') 
,('ac','NA','NA','car ') 
,(null,'NA','NA','11pm ') 
,(null,'bike','NA','NA ') 
,(null,'9am','NA','NA ') 

; 

WITH CTE 
AS (
    SELECT Cstmr 
     ,morning 
     ,afternoon 
     ,night 
     ,ROW_NUMBER() OVER (
      ORDER BY (
        SELECT NULL 
        ) 
      ) rn 
    FROM @t 
    ) 
    ,CTE1 
AS (
    SELECT cstmr 
     ,morning 
     ,afternoon 
     ,night 
     ,rn 
     ,CASE 
      WHEN morning = 'NA' 
       THEN 0 
      WHEN isdate(morning) = 0 
       THEN 1 
      ELSE 2 
      END rnm 
     ,CASE 
      WHEN afternoon = 'NA' 
       THEN 0 
      WHEN isdate(afternoon) = 0 
       THEN 1 
      ELSE 2 
      END rnaf 
     ,CASE 
      WHEN night = 'NA' 
       THEN 0 
      WHEN isdate(night) = 0 
       THEN 1 
      ELSE 2 
      END rnn 
    FROM cte c 
    WHERE rn = 1 

    UNION ALL 

    SELECT CASE 
      WHEN c.cstmr IS NULL 
       THEN c1.cstmr 
      ELSE c.cstmr 
      END 
     ,c.morning 
     ,c.afternoon 
     ,c.night 
     ,c.rn 
     ,CASE 
      WHEN c.morning = 'NA' 
       THEN 0 
      WHEN isdate(c.morning) = 0 
       THEN 1 
      ELSE 2 
      END rnm 
     ,CASE 
      WHEN c.afternoon = 'NA' 
       THEN 0 
      WHEN isdate(c.afternoon) = 0 
       THEN 1 
      ELSE 2 
      END rnaf 
     ,CASE 
      WHEN c.night = 'NA' 
       THEN 0 
      WHEN isdate(c.night) = 0 
       THEN 1 
      ELSE 2 
      END rnn 
    FROM cte c 
    INNER JOIN cte1 c1 ON c.rn = c1.rn + 1 
    ) 
SELECT m.Cstmr 
    ,m.morning 
    ,m.rnm 
    ,a.afternoon 
    ,n.night 
FROM cte1 m 
LEFT JOIN cte1 a ON a.cstmr = m.cstmr 
    AND m.rnm = a.rnaf 
LEFT JOIN cte1 n ON n.cstmr = m.cstmr 
    AND m.rnm = n.rnn 
WHERE m.morning <> 'NA'