2016-07-04 16 views
0

うん、正しいタイトルを取得するだけで10分かかりました。いくつかの背景情報:私のテーブルには、複数のサーバーからのバックアップ結果が含まれています。簡単にするためにただ一つのサーバのためのいくつかの行:SQL Server:複数の列をピボット

hostname type_id result_id received 
---------------------------------------- 
SBS2011  5  1  2016-06-28 
SBS2011  5  1  2016-06-28 
SBS2011  5  1  2016-06-29 
SBS2011  5  1  2016-06-29 
SBS2011  5  1  2016-06-30 
SBS2011  6  1  2016-06-30 
SBS2011  5  2  2016-07-01 
SBS2011  6  2  2016-07-01 
SBS2011  6  2  2016-07-01 
SBS2011  5  1  2016-07-02 
SBS2011  6  1  2016-07-02 
SBS2011  5  1  2016-07-03 
SBS2011  6  1  2016-07-03 
SBS2011  5  1  2016-07-04 
SBS2011  6  1  2016-07-04 

PIVOTを使用するには、私は、各曜日のバックアップの量の概要を取得することができます

hostname 1 2 3 4 5 6 7 
-------------------------------------- 
SBS2011  2 2 2 2 2 3 2 

:中

select * from 
(
    select [hostname], [type_id], datepart(w, received) as workday from [backups] 
) TEMP 
pivot (
    count([type_id]) 
    for workday in 
    ([1], [2], [3], [4], [5], [6], [7]) 
) as pvt; 

結果しかし、この結果はいくつかの重要な情報を欠場する。 result_idには、「成功」を等しくし、result_idには等しく「失敗した」として、私はこのように見える結果を持っているしたいと思います:

hostname 1:1 1:2 2:1 2:2 3:1 3:2 4:1 4:2 5:1 5:2 6:1 6:2 7:1 7:2 
------------------------------------------------------------------- 
SBS2011  2 0 2 0 2 0 2 0 2 0 0 3 2 0 
ColumnNameに1

:1は日曜日の省略形です:成功と1:2の日曜日に等しいです:失敗しました。いくつかのバックアップのtype_idには、sunday:retryの列1:3もあります。

私が見たように、ダイナミックピボットがこのパズルを解く鍵となることがわかりました。他はPARTITION BYを提案していますが、私はまだどのように発見していません。ダイナミックピボットは最も有望なようですが、私はどのように分かりません。これを作成するのを手伝ってください - 私にとっては複雑な - クエリですか?

答えて

0

あなたは、動的SQLをいじるしたくない場合は、単に静的な、それを維持し、上に旋回される列を変更することができます。

ようなクエリ:

select * 
from 
(
    select 
     [hostname], 
     [type_id], 
     concat(datepart(w, received),':',result_id) as workday 
    from [backups] 
) TEMP 
pivot (
    count([type_id]) 
    for workday in (
     -- maybe you don't want the :3 option for all days? Adjust as needed 
     [1:1],[1:2],[1:3], 
     [2:1],[2:2],[2:3], 
     [3:1],[3:2],[3:3], 
     [4:1],[4:2],[4:3], 
     [5:1],[5:2],[5:3], 
     [6:1],[6:2],[6:3], 
     [7:1],[7:2],[7:3] 
    ) 
) as pvt; 

は、あなたが望むような結果を与えるかもしれませんか?

0

これをチェックして問題が解決するかどうかを確認してください。これをさらに単純化することができますが、type_id(5と6)のデコードの内容を知る必要があります。より多くのtype_idがありますか?

result_id = 1 =成功と2 =失敗権利?

質問特定の日にバックアップが実行されないとどうなりますか?:)その日の記録がないので、あなたはどのようにそのような状況に対処しますか? :)

/* Create table and populate with sample data. 
create table Backups (hostname varchar(10), type_id int , result_id int , received datetime) 

insert into Backups (hostname , type_id ,result_id , received) values 
('SBS2011',  5 ,  1  ,'2016-06-28'), 
('SBS2011',  5 ,  1  ,'2016-06-28'), 
('SBS2011',  5 ,  1  ,'2016-06-29'), 
('SBS2011',  5 ,  1  ,'2016-06-29'), 
('SBS2011',  5 ,  1  ,'2016-06-30'), 
('SBS2011',  6 ,  1  ,'2016-06-30'), 
('SBS2011',  5 ,  2  ,'2016-07-01'), 
('SBS2011',  6 ,  2  ,'2016-07-01'), 
('SBS2011',  6 ,  2  ,'2016-07-01'), 
('SBS2011',  5 ,  1  ,'2016-07-02'), 
('SBS2011',  6 ,  1  ,'2016-07-02'), 
('SBS2011',  5 ,  1  ,'2016-07-03'), 
('SBS2011',  6 ,  1  ,'2016-07-03'), 
('SBS2011',  5 ,  1  ,'2016-07-04'), 
('SBS2011',  6 ,  1  ,'2016-07-04') 

select * , DatePart(w, received) from dbo.Backups b 

*/ 

問合せ:

SELECT -- S.*, F.* 
     S.[hostname], 
     S.[1] as [1:1], 
     F.[1] as [1:2], 
     S.[2] as [2:1], 
     F.[2] as [2:2], 
     S.[3] as [3:1], 
     F.[3] as [3:2], 
     S.[4] as [4:1], 
     F.[4] as [4:2], 
     S.[5] as [5:1], 
     F.[5] as [5:2], 
     S.[6] as [6:1], 
     F.[6] as [6:2], 
     S.[7] as [7:1], 
     F.[7] as [7:2] 

FROM 
(
    select * from 
    (
     select [hostname], [type_id], datepart(w, received) as workday , result_id as res_type from [backups] where result_id = 1 

    ) TEMP 
    pivot 
    (
     count([type_id]) 
     for workday in 
     ([1], [2], [3], [4], [5], [6], [7]) 
    ) as pvt 

) S 
LEFT OUTER JOIN 
(
    select * from 
    (
     select [hostname], [type_id], datepart(w, received) as workday , result_id as res_type from [backups] where result_id = 2 

    ) TEMP 
    pivot 
    (
     count([type_id]) 
     for workday in 
     ([1], [2], [3], [4], [5], [6], [7]) 
    ) as pvt 

) F ON S.res_type = F.res_type - 1 
WHERE F.hostname IS NOT NULL 
+0

はい、type_idの1〜4もホストによって異なります。これらの2つのresult_idもありますが、拡張するのは難しいはずはありません。実行に失敗したバックアップは、本当に別の質問と別のクエリです。今のところ私は異なるtype_idの合計に固執するでしょう。総額が他の日よりも少ない場合、何かが間違っていました。 – mokum

+0

Type_idは、ソースソフトウェアとバックアップタイプを表します。 Type_id = 1はたとえばAcronis VMprotect、type_id = 2はAcronis VMprotectデュアルデスティネーション、type_id = 3はSymantec BackupExecなどと等しくなります – mokum

関連する問題