9

私は2つのテーブルを持っています。
以下は、目的の出力を得るために必要な手順です。ステップ 3 まで実行できます。少し複雑で、さらに先に進む方法がわかりません。助けてください。

表1

Site  Code FailFlag  Comments  ModifiedDate  ModifiedBy
ABT   A01     F      Dfasdf    10/11/2011    Anna
ABT   A01     F      dsfsdf    15/12/2012    Mand
ABT   A01            Rds       30/03/2011    Tim
ABT   A01            GHDs      02/12/2012    Andy
ABT   A02     F      dfd       09/05/2012    Anna
ABT   A02            sdada     11/02/2013    Kathy
ABT   A02            Dfg       15/05/2011    Rob
AFL   A02     F      asda      13/02/2011    Dan
AFL   A02            dsaa      24/12/2010    Ryan
TRG   A01            sdasd     16/04/2010    Richard
TRG   K05            jksdh     23/04/2012    Mark
KLD   K05     F      sd        18/05/2013    Jim
KLD   K05            dsfsd     10/03/2012    James
KLD   K05            sdsd      12/05/2011    Luther
KTY   K05     F      saq       09/09/2012    Ryan
KTY   K05            asd       04/04/2010    Kathy
KMD   C02     F      nas       29/02/2012    Rob
KMD   C02            asda      11/11/2011    Andy

表 2 :

Site  Code   Freq     StartDate   EndDate
ABT   A01    43       01/01/2011  01/02/2012
ABT   A02    254      01/01/2011  19/02/2011
ABT   A02    109      20/02/2011  01/01/2012
ABT   A02    12       02/01/2012  01/01/2013
AFL   A02    13       01/01/2011  01/02/2012
TRG   A01    122      01/01/2011  01/02/2012
TRG   K05    61       01/01/2011  01/02/2012
KLD   KO5    33       01/01/2011  15/05/2012
KLD   K05    79       16/05/2012  01/01/2013
KTY   K05    52       01/01/2011  01/02/2012
KMD   C02    78       01/01/2011  01/02/2012
ZYT   G01    11       01/01/2011  01/02/2012
PYN   A01    15       01/01/2011  01/02/2012
DYN   F08    122      01/01/2011  01/02/2012

手順 :

  1. 表 1 の 2 つの列「サイト」と「コード」の組み合わせは、表 2 の列「サイト」と「コード」の組み合わせに基づいています。

  2. 「失敗」列で同じものをフィルタリングし、失敗の数を調べます

    以下は、クエリと出力です。

    SELECT Site,Code,COUNT(*) as [Count],
    FailFlagCount= SUM(CASE WHEN F = 'F' THEN 1 ELSE 0 END) FROM Table1 
    GROUP BY Site,Det
    
    
    Site Code    Count   FailFlagCount
    ABT   A01     4      2
    ABT   A02     3      1
    AFL   A02     2      1
    TRG   A01     1      0
    TRG   K05     1      0      
    KLD   KO5     3      1
    KTY   K05     2      1
    KMD   C02     2      1
    
  3. 表 2 で同じ組み合わせを確認します。つまり、ステップ 2 の出力のサイトとコードを表 2 に調べて、その頻度を取得します。

  4. 計算:

    a. CC % = [1-(FailCount / カウント)]*100 = [1-(2/4)]*100

    b. BPO % = [1-(FailCount / Freq)]*100 = [1-(2/43)]*100

    c.Forecast% =

    今月が3月だとしましょう。

    過去 3 年間の故障数を計算し、平均を求めて、「X」としましょう。
    残りの月の失敗を計算します。'Y' = (X * 残りの月/12)
    12 か月間の合計失敗 = 現在の失敗 + Y

    したがって、Forecast% = [1-(12 か月間の総障害数/頻度)]*100 です。

    この例では、X = 2 の値を仮定すると、Y = (2 * 9/12) となります。

    予測 % = [1-(1+1.5)]*100

  5. 上記の計算は、サイトとコードのすべての可能な組み合わせに対して行われます。

    Site    Code    CC  B.P.O   Forecast   StartDate    EndDate
    ABT   A01                                  01/01/2011  01/02/2012
    ABT   A02                                  01/01/2011  19/02/2011
    ABT   A02                                  20/02/2011  01/01/2012
    ABT   A02                                  02/01/2012  01/01/2013
    AFL   A02                                  01/01/2011  01/02/2012
    TRG   A01                                  01/01/2011  01/02/2012
    TRG   K05                                  01/01/2011  01/02/2012
    KLD   K05                                  01/01/2011  15/05/2012
    KLD   K05                                  16/05/2012  01/01/2013
    KTY   K05                                  01/01/2011  01/02/2012
    KMD   C02                                  01/01/2011  01/02/2012
    
  6. 上記の表のグループ化は、サイト タイプ、つまりサイトの最初の文字で行われます。次に、すべての計算 (cc、BPO、Forecast) の平均がグループ化後に行われます。たとえば、「ABT」は「A」、「TRG」は「T」です。(複数のタイプに対して複数のテーブルを作成し、ユニオンを実行して以下のクエリを取得すると仮定しています)
    例:-

    Site     Code                             CC     B.P.O    Forecast          
     A    A01  
     A    A02 
        [i.e.,Avg value of (ABT and A02) 
             and (AFL and A02)]  
     T    A01 
     T    K05 avg
        [i.e., Avg value of (KLD and K05) 
             and (KTY and K05)]  
     K    K05 
     K    C02 
    

これが私の最終的な出力になるはずです。親切に助けてください。

支援を容易にするためにテーブルにスクリプトを追加します。

表 1 スクリプト:

CREATE TABLE Table1
    (
    ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    Site VARCHAR(5),
    Code VARCHAR(5),
    FailFlag CHAR(1),
    Comments VARCHAR(100),
    ModifiedDate  DATETIME,
    ModifiedBy   VARCHAR(50)
    );

INSERT INTO Table1 
      (Site,  Code,  FailFlag, Comments, ModifiedDate, ModifiedBy)
SELECT 'ABT', 'A01',   'F',    'Dfasdf', '10/11/2011', 'Anna'    UNION ALL
SELECT 'ABT', 'A01',   'F',    'dsfsdf', '15/12/2012', 'Mand'    UNION ALL
SELECT 'ABT', 'A01',   NULL,   'Rds',    '30/03/2011', 'Tim'     UNION ALL
SELECT 'ABT', 'A01',   NULL,   'GHDs',   '02/12/2012', 'Andy'    UNION ALL
SELECT 'ABT', 'A02',   'F',    'dfd',    '09/05/2012', 'Anna'    UNION ALL
SELECT 'ABT', 'A02',   NULL,   'sdada',  '11/02/2013', 'Kathy'   UNION ALL
SELECT 'ABT', 'A02',   NULL,   'Dfg',    '15/05/2011', 'Rob'     UNION ALL
SELECT 'AFL', 'A02',   'F',    'asda',   '13/02/2011', 'Dan'     UNION ALL
SELECT 'AFL', 'A02',   NULL,   'dsaa',   '24/12/2010', 'Ryan'    UNION ALL
SELECT 'TRG', 'A01',   NULL,   'sdasd',  '16/04/2010', 'Richard' UNION ALL
SELECT 'TRG', 'K05',   NULL,   'jksdh',  '23/04/2012', 'Mark'    UNION ALL
SELECT 'KLD', 'K05',   'F',    'sd',     '18/05/2013', 'Jim'     UNION ALL
SELECT 'KLD', 'K05',   NULL,   'dsfsd',  '10/03/2012', 'James'   UNION ALL
SELECT 'KLD', 'K05',   NULL,   'sdsd',   '12/05/2011', 'Luther'  UNION ALL
SELECT 'KTY', 'K05',   'F',    'saq',    '09/09/2012', 'Ryan'    UNION ALL
SELECT 'KTY', 'K05',   NULL,   'asd',    '04/04/2010', 'Kathy'   UNION ALL
SELECT 'KMD', 'C02',   'F',    'nas',    '29/02/2012', 'Rob'     UNION ALL
SELECT 'KMD', 'C02',   NULL,   'asda',   '11/11/2011', 'Andy';

表 2 スクリプト:

CREATE TABLE Table2
    (
    ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    Site VARCHAR(5),
    Code VARCHAR(5),
    Freq  int,
    StartDate  DATETIME,
    EndDate  DATETIME
    );

INSERT INTO Table2 (Site, Code, Freq, StartDate, EndDate)
SELECT 'ABT', 'A01', 43,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'ABT', 'A02', 254, '01/01/2011', '19/02/2011' UNION ALL
SELECT 'ABT', 'A02', 109, '20/02/2011', '01/01/2012' UNION ALL
SELECT 'ABT', 'A02', 12,  '02/01/2012', '01/01/2013' UNION ALL
SELECT 'AFL', 'A02', 13,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'TRG', 'A01', 122, '01/01/2011', '01/02/2012' UNION ALL
SELECT 'TRG', 'K05', 61,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'KLD', 'KO5', 33,  '01/01/2011', '15/05/2012' UNION ALL
SELECT 'KLD', 'K05', 79,  '16/05/2012', '01/01/2013' UNION ALL
SELECT 'KTY', 'K05', 52,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'KMD', 'C02', 78,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'ZYT', 'G01', 11,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'PYN', 'A01', 15,  '01/01/2011', '01/02/2012' UNION ALL
SELECT 'DYN', 'F08', 122, '01/01/2011', '01/02/2012';
4

1 に答える 1

1

「ちょっとコンプレックス」はい。

上から順に、ステップ 2 を示します。これには、3 年間または 12 か月間という制限がないという点で、重大な欠陥がある可能性があります。あなたの質問からはそれが意図されたものかどうかは明らかではないので、これを使用します。

SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site,Code;

周波数フィールドを取得するには、それを Table2 と結合する必要があります。それをサブセレクトでラップし、そのサブクエリを S2 と呼んだのは、それがステップ 2 だったからです。

SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, Table2.Freq
FROM
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site,Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
;

CC と BPO の計算は比較的簡単です。上記はS3というサブクエリになります。

ここでゼロ除算エラーを防止したことに注意してください。

SELECT Site, Code, [Count], FailFlagCount, Freq,
CASE WHEN [Count]=0 THEN 0 ELSE  ( 1-(FailFlagCount / [Count]))*100 END  CC,
CASE WHEN Freq = 0 THEN 0 ELSE ( 1-(FailFlagCount / Freq))*100 END BPO

FROM
(
SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, ISNULL(Table2.Freq, 1) AS Freq
FROM   
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site,Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
) s3
;

さて、SQL の月関数、残りの月数の計算方法、今年の 1 日について少し実験してみましょう。

select GETDATE(), month(GETDATE()), 12-MONTH(GETDATE()),
DATEADD(YEAR, -3, GETDATE()),
DATEFROMPARTS (YEAR(GETDATE()),1,1)
;

これで、Y の数値を計算できます。これは table1 の全体ですが、過去 36 か月間をフィルター処理してから、月平均を計算します。これを月の途中で実行すると、ここに暗黙的なエラーが忍び寄る可能性があります。月の境界を破っていません。今月を除いて、過去 36 か月ではなく、過去 3 年間を完了しています。

count(*) を float としてキャストする必要があったことに注意してください。それ以外の場合は整数であり、除算で 0 に丸められます。

SELECT SITE, CODE, count(*) tot, cast(count(*) as float)/36 avg, (cast(count(*) as float)/36) * ((12-MONTH(GETDATE()))/12) Y
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEADD(YEAR, -3, GETDATE())
GROUP BY SITE, CODE;

そして、今年の失敗を同じ方法で計算します。

SELECT SITE, CODE, COUNT(*) currFails 
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEFROMPARTS (YEAR(GETDATE()),1,1)
GROUP BY SITE, CODE;

したがって、上記の 3 つの手順を組み合わせて、Y と現在の年が失敗したテーブルを取得できます。今年障害のないサイトを補うために、LEFT JOIN とともに ISNULL があることに注意してください。

SELECT s3.Site, s3.Code, [Count], FailFlagCount, Freq,
CASE WHEN [Count]=0 THEN 0 ELSE  ( 1-(FailFlagCount / [Count]))*100 END  CC,
CASE WHEN Freq = 0 THEN 0 ELSE ( 1-(FailFlagCount / Freq))*100 END BPO,
ISNULL(YBIt.Y, 0) Y,
isnull(currBit.currFails, 0) as currFails

FROM
(
SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, ISNULL(Table2.Freq, 1) AS Freq
FROM   
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site,Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
) s3

LEFT JOIN
(
SELECT SITE, CODE, count(*) tot, cast(count(*) as float)/36 avg, (cast(count(*) as float)/36) * ((12-MONTH(GETDATE()))/12) Y
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEADD(YEAR, -3, GETDATE())
GROUP BY SITE, CODE
) YBit on S3.Site = Ybit.site AND S3.code = YBit.code 

LEFT JOIN
(
SELECT SITE, CODE, COUNT(*) currFails 
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEFROMPARTS (YEAR(GETDATE()),1,1)
GROUP BY SITE, CODE
) currBit ON s3.site = currBit.site and s3.code = currBit.code;

;

これで、ようやく予測を計算できます。

SELECT Site, code, [Count], FAilFlagCount, Freq,
   CC, BPO, Y, currFails, Y+currFails totF12,
    CASE WHEN Freq = 0 then 0 else (1-(( Y+currFails)/ Freq))*100 END Forecast
 FROM 
(
SELECT s3.Site, s3.Code, [Count], FailFlagCount, Freq,
CASE WHEN [Count]=0 THEN 0 ELSE  ( 1-(FailFlagCount / [Count]))*100 END  CC,
CASE WHEN Freq = 0 THEN 0 ELSE ( 1-(FailFlagCount / Freq))*100 END BPO,
ISNULL(YBIt.Y, 0) Y,
isnull(currBit.currFails, 0) as currFails

FROM
(
SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, ISNULL(Table2.Freq, 1) AS Freq
FROM   
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site, Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
) s3

LEFT JOIN
(
SELECT SITE, CODE, count(*) tot, cast(count(*) as float)/36 avg, (cast(count(*) as float)/36) * ((12-MONTH(GETDATE()))/12) Y
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEADD(YEAR, -3, GETDATE())
GROUP BY SITE, CODE
) YBit on S3.Site = Ybit.site AND S3.code = YBit.code 

LEFT JOIN
(
SELECT SITE, CODE, COUNT(*) currFails 
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEFROMPARTS (YEAR(GETDATE()),1,1)
GROUP BY SITE, CODE
) currBit ON s3.site = currBit.site and s3.code = currBit.code

) S4A
;

OK、突然、開始日と終了日が再び必要になります。これらは表 2 にあり、これもサイト + コードのマスター リストである可能性が高いと思われます。それでは、それをプライマリにして、計算を左結合で結合しましょう。サイトの種類も計算します。

これは、各サイト + コードの詳細な計算です。

select left (t2.site, 1) siteType, t2.site, t2.code, 
  [Count], FAilFlagCount, s4.Freq,
   CC, BPO, Forecast,
    T2.StartDate, T2.EndDAte

FROM 
 Table2 T2 
LEFT JOIN
(

SELECT Site, code, [Count], FAilFlagCount, Freq,
   CC, BPO, Y, currFails, Y+currFails totF12,
    CASE WHEN Freq = 0 then 0 else (1-(( Y+currFails)/ Freq))*100 END Forecast
 FROM 
(
SELECT s3.Site, s3.Code, [Count], FailFlagCount, Freq,
CASE WHEN [Count]=0 THEN 0 ELSE  ( 1-(FailFlagCount / [Count]))*100 END  CC,
CASE WHEN Freq = 0 THEN 0 ELSE ( 1-(FailFlagCount / Freq))*100 END BPO,
ISNULL(YBIt.Y, 0) Y,
isnull(currBit.currFails, 0) as currFails

FROM
(
SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, ISNULL(Table2.Freq, 1) AS Freq
FROM   
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site, Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
) s3

LEFT JOIN
(
SELECT SITE, CODE, count(*) tot, cast(count(*) as float)/36 avg, (cast(count(*) as float)/36) * ((12-MONTH(GETDATE()))/12) Y
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEADD(YEAR, -3, GETDATE())
GROUP BY SITE, CODE
) YBit on S3.Site = Ybit.site AND S3.code = YBit.code 

LEFT JOIN
(
SELECT SITE, CODE, COUNT(*) currFails 
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEFROMPARTS (YEAR(GETDATE()),1,1)
GROUP BY SITE, CODE
) currBit ON s3.site = currBit.site and s3.code = currBit.code

) S4A
) S4 
on t2.site = s4.site and t2.code = s4.code
;

そこから、平均を簡単に作成できます。

SELECT siteType, '' as site, '' as code, avg([count]) [count], avg(FailFlagCount) FailFlagCount, avg(Freq) Freq, 
    avg (CC) CC, avg(BPO) BPO, avg(Forecast) Forecast, '' StartDAte, '' EndDate
FROM 
(

select left (t2.site, 1) siteType, t2.site, t2.code, 
  [Count], FAilFlagCount, s4.Freq,
   CC, BPO, Forecast,
    T2.StartDate, T2.EndDAte

FROM 
 Table2 T2 
LEFT JOIN
(

SELECT Site, code, [Count], FAilFlagCount, Freq,
   CC, BPO, Y, currFails, Y+currFails totF12,
    CASE WHEN Freq = 0 then 0 else (1-(( Y+currFails)/ Freq))*100 END Forecast
 FROM 
(
SELECT s3.Site, s3.Code, [Count], FailFlagCount, Freq,
CASE WHEN [Count]=0 THEN 0 ELSE  ( 1-(FailFlagCount / [Count]))*100 END  CC,
CASE WHEN Freq = 0 THEN 0 ELSE ( 1-(FailFlagCount / Freq))*100 END BPO,
ISNULL(YBIt.Y, 0) Y,
isnull(currBit.currFails, 0) as currFails

FROM
(
SELECT s2.Site, s2.Code,s2.[Count], S2.FailFlagCount, ISNULL(Table2.Freq, 1) AS Freq
FROM   
(
SELECT Site,Code,COUNT(*) as [Count],
FailFlagCount= SUM(CASE WHEN FailFlag = 'F' THEN 1 ELSE 0 END)
FROM Table1 
GROUP BY Site, Code
) S2
LEFT JOIN Table2 on S2.Site = table2.Site and S2.Code = table2.Code
) s3

LEFT JOIN
(
SELECT SITE, CODE, count(*) tot, cast(count(*) as float)/36 avg, (cast(count(*) as float)/36) * ((12-MONTH(GETDATE()))/12) Y
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEADD(YEAR, -3, GETDATE())
GROUP BY SITE, CODE
) YBit on S3.Site = Ybit.site AND S3.code = YBit.code 

LEFT JOIN
(
SELECT SITE, CODE, COUNT(*) currFails 
FROM Table1 
WHERE FailFlag = 'F'
AND ModifiedDate >= DATEFROMPARTS (YEAR(GETDATE()),1,1)
GROUP BY SITE, CODE
) currBit ON s3.site = currBit.site and s3.code = currBit.code

) S4A
) S4 
on t2.site = s4.site and t2.code = s4.code
) S5
GROUP BY siteType
;

または、テーブルに詳細な計算を入力してから、最終的な計算を使用する代わりに、その平均を計算することもできます。

最後の合体はお任せします。

于 2013-06-27T09:35:31.250 に答える