2017-04-21 9 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はCustomerです。朝6時から12時。午後:午後12時〜午後10時。夜間:午後10時〜午前6時。お客様の「ab」は、午前9時、午後2時、午後11時に自転車を提供しています。時間に応じて、各列にデータを表示する必要があります。その時点で車両が提供されていない場合は、N/Aと表示されます。

And this is how parent and child groups are formed.

+2

良い質問。さて、さまざまな値が互いにどのように関係しているのかを教えてください。多分あなたは答えを得るでしょう。 –

+1

CstmrはCustomerです。朝6時から12時。午後:午後12時〜午後10時。夜間:午後10時〜午前6時。お客様の「ab」は、午前9時、午後2時、午後11時に自転車を提供しています。時間に応じて、各列にデータを表示する必要があります。その時間に車両がない場合は、N/Aと表示されます。 – user7814194

+0

私は "SSRS"に気付かなかった。報告書に私のアプローチは異なるかもしれない。 – KumarHarsh

答えて

0

私見、それはデータがすべてで正規化されていないビューのプロジェクトの観点から良い質問は?どのように来ます。

第2に、「これが私のテーブルの取得方法」です。 これは、実際のテーブルがこれとどのようになっているか、またはクエリの後に結果セットを取得する方法です。

第3に、このスクリプトを他のサンプルデータと一緒に試して、問題点を教えてください。 上記のスクリプトが正しくても遅い場合は、すべてのビジネス要件にページングを適用できます。

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' 
関連する問題