2017-03-22 3 views
1

地域、地区、およびクライアントが列A、B、Cに設定されたテーブルが作成されるクエリの開発が割り当てられました。残りの列にキャンペーン名が列ヘッダー(行1)として表示されます。管理者は、ピボットテーブルの本体にある連絡先名と連絡先の両方を必要とします。このように:複数のサブクエリと行「ヘッダー」を持つSQL Server 2012動的ピボットテーブル - これを行うことはできますか?

Region |District |ClientID |Campaign1 |Campaign2 |Campaign3 
========|===========|===========|===========|===========|=========== 
1  |A   |830  | NULL | NULL | NULL   
========|===========|===========|===========|===========|=========== 
1  |A   |832  |Name One | NULL |Name One 
     |   |   |Date  |   |Date   
========|===========|===========|===========|===========|=========== 
1  |A   |833  | NULL | NULL | NULL  
========|===========|===========|===========|===========|=========== 
1  |A   |834  | NULL | NULL | NULL  
========|===========|===========|===========|===========|=========== 
1  |A   |837  |Name Two | NULL | NULL  
     |   |   |Date  |   |   
========|===========|===========|===========|===========|=========== 
1  |A   |841  | NULL | NULL | NULL  
========|===========|===========|===========|===========|=========== 
2  |K   |262  | NULL | NULL | NULL   
========|===========|===========|===========|===========|=========== 
2  |L   |266  | NULL | NULL | NULL     
     |   |   |   |   |    
========|===========|===========|===========|===========|=========== 

私はこのポジションで新しいです。私はSQL Serverの初心者レベルです。私はSQL Server 2012の機能の限界についてはわかりません。

|ClientID |Campaign1 |Campaign2 |Campaign3 |Campaign4 | 
|===========|===========|===========|===========|===========| 
|830  | NULL | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|832  |Name One | NULL |Name One |Name One | 
|===========|===========|===========|===========|===========| 
|833  | NULL | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|834  | NULL | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|837  |Name Two | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|841  | NULL | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|262  | NULL | NULL | NULL | NULL | 
|===========|===========|===========|===========|===========| 
|266  | NULL | NULL | NULL |Name Six | 
|===========|===========|===========|===========|===========| 

現在のクエリを::

はこれまでのところ、私はそれを次のクエリから、これらの結果を得ることができました

IF Object_ID('tempdb.dbo.#temp') is not null 
drop table dbo.#temp 

SELECT * 
INTO #temp 
FROM 
    (
    SELECT MC.Region,MC.District,MS.ClientID,ML.CampaignName,MCL.ContactName 
    FROM MnfstClient MC 
    LEFT JOIN ManifestSummary MS on MC.ClientID=MS.ClientID  
    LEFT JOIN MnfstList ML on ML.FileDetailID=MS.FileID 
    and MS.ControlGroupFlag=0 
    LEFT JOIN MnfstClientList MCL on MS.ClientID=MCL.ClientID 
    and ML.ListID=MCL.ListID 
WHERE ML.InHomeDate Between '2016-04-01' and '2017-03-31' 
GROUP By MC.Region,MC.District,MS.ClientID,ML.CampaignName,MCL.ContactName) A 
DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.CampaignName) 
     FROM #temp c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
SET @query = 'SELECT ClientID, ' + @cols + ' from 
     (
      SELECT 
       Region 
       ,District 
       ,ClientID 
       ,ContactName 
       ,CampaignName 
      FROM #temp 
     ) x 
     PIVOT 
     (
      max(ContactName) 
      for CampaignName in (' + @cols + ') 
     ) p ' 
EXECUTE(@query) 

私は 'を実行したときにここで#TEMPに何があるかです声明「INTO SELECT:

+--------+----------+----------+--------------+-------------+-------+ 
| Region | District | ClientID | CampaignName | ContactName | Date | 
+--------+----------+----------+--------------+-------------+-------+ 
|  1 | A  |  830 | Campaign1 | null  | Date | 
|  1 | A  |  830 | Campaign2 | null  | Date | 
|  1 | A  |  830 | Campaign3 | null  | Date | 
|  1 | A  |  832 | Campaign1 | Name One | Date | 
|  1 | A  |  832 | Campaign2 | null  | Date | 
|  1 | A  |  832 | Campaign3 | Name One | Date | 
|  1 | A  |  833 | Campaign1 | null  | Date | 
|  1 | A  |  833 | Campaign2 | null  | Date | 
|  1 | A  |  833 | Campaign3 | null  | Date | 
|  1 | A  |  834 | Campaign1 | null  | Date | 
|  1 | A  |  834 | Campaign2 | null  | Date | 
|  1 | A  |  834 | Campaign3 | null  | Date | 
|  1 | A  |  837 | Campaign1 | Name Two | Date | 
|  1 | A  |  837 | Campaign2 | null  | Date | 
|  1 | A  |  837 | Campaign3 | null  | Date | 
|  1 | A  |  841 | Campaign1 | null  | Date | 
|  1 | A  |  841 | Campaign2 | null  | Date | 
|  1 | A  |  841 | Campaign3 | null  | Date | 
|  2 | K  |  262 | Campaign1 | null  | Date | 
|  2 | K  |  841 | Campaign2 | null  | Date | 
|  2 | K  |  841 | Campaign3 | null  | Date | 
|  2 | L  |  841 | Campaign1 | null  | Date | 
|  2 | L  |  841 | Campaign2 | null  | Date | 
|  2 | L  |  841 | Campaign3 | null  | Date | 
+--------+----------+----------+--------------+-------------+-------+ 

だから、あなたはそれを持っています。クエリ結果を希望どおりに表示できない場合は、クエリを実行し、結果をExcelにリージョン、地域、クライアントのテーブルとともにダンプし、VLOOKUPを使用する必要があります。エンドユーザーはそれを行うことはできません。したがって、毎週クエリを実行してExcelの変更を加えるのは私の仕事です。 (そして、私のために、仕事=悪い)

それでは、答えは何ですか?所望のピボットの複雑さを達成できるか?

ありがとうございました!

+0

「#temp」のデータはどのようなものになりますか?いくつかのサンプルのデータを見ることなく、最終結果を得ることは難しいでしょう。また、動的SQLバージョンに取り組む前に、これをハードコーディングされたバージョンとして記述してみてください。 – Taryn

+0

ありがとう、bluefeet。 元の質問のクエリの後に#tempのデータを追加しました。 (私はstackoverflowにも新しいことを教えていただけますか?何が必要なのか、どのように見た目を実現するのか分かりません) –

答えて

0

ContactNameDateの列を連結して、望ましい結果を得ることができるようです。それらがサブクエリで連結されると、その新しい列を使用して最終結果を取得します。静的および動的バージョンの両方で

SET @query = 'SELECT Region, District, ClientId, ' + @cols + ' 
       from 
       (
        SELECT 
         Region 
         ,District 
         ,ClientID 
         ,ContactName = ContactName + '' '' + Date -- concatenated column 
         ,CampaignName 
        FROM #yourquery 
      ) x 
       PIVOT 
       (
        max(ContactName) 
        for CampaignName in (' + @cols + ') 
      ) p ' 

EXECUTE(@query) 

See Demo:にクエリを変更します。

+0

これは完全に動作します。集計値、名前と日付。 私は感謝しています! –

関連する問題