2016-08-16 4 views
3

今、私は部分、ジョブ、マシン、および種類によるグループ化に基づいて合計時間を集計しています。条件に基づいて1つの列を複数の列に合計SQL Server

タイプに基づいて複数の列ではなく、複数の列に分割される合計時間を持つことができます。これどうやってするの?

enter image description here

しかし、私が欲しい:

enter image description here

はあなたのすべてをありがとう

はここで生産私のコード

SELECT 
    m.[machineName] 
    ,pr.[jobNumber] 
    ,p.[partNumber] 
    ,sc.[type] 
    ,SUM(pl.[elapsedTime]) AS elapsedTime 
FROM wincc.dbo.productionLog pl 
    INNER JOIN wincc.dbo.machines m  ON pl.[machineId]  = m.id 
    INNER JOIN wincc.dbo.productionRuns pr ON pl.[productionRunId] = pr.id 
    INNER JOIN wincc.dbo.parts p   ON pr.[partId]   = p.Id 
    INNER JOIN wincc.dbo.statusCodes sc ON pl.[statusCodeId] = sc.id 
GROUP BY 
    m.[machineName] 
    ,pr.[jobNumber] 
    ,p.[partNumber] 
    ,sc.[type] 

です!

答えて

3

これはテーブルpivotingの形式です。 conditional aggregationでこれを行う方法の1つは:

SELECT 
    m.[machineName] 
    ,pr.[jobNumber] 
    ,p.[partNumber] 
    ,SUM(CASE WHEN sc.Type = 'planned downtime' then pl.[elapsedTime] END) AS plannedDT 
    ,SUM(CASE WHEN sc.Type = 'unplanned downtime' then pl.[elapsedTime] END) AS unplannedDT 
    ,SUM(CASE WHEN sc.Type = 'production' then pl.[elapsedTime] END) AS production 
    ,SUM(CASE WHEN sc.Type = 'rework' then pl.[elapsedTime] END) AS rework 
FROM wincc.dbo.productionLog pl 
    INNER JOIN wincc.dbo.machines m  ON pl.[machineId]  = m.id 
    INNER JOIN wincc.dbo.productionRuns pr ON pl.[productionRunId] = pr.id 
    INNER JOIN wincc.dbo.parts p   ON pr.[partId]   = p.Id 
    INNER JOIN wincc.dbo.statusCodes sc ON pl.[statusCodeId] = sc.id 
GROUP BY 
    m.[machineName] 
    ,pr.[jobNumber] 
    ,p.[partNumber] 
+0

これは完全に機能します。私はちょうどCASE WHEN文を見つけてそれを試しました。 –

関連する問題