この問題を解決したいのですが、誰かに解決を手伝ってもらいたいです。プログラムコードで問題を解決する方が簡単だと思っていましたが、その考えを変え始めています。
PIVOT
ステートメントからプル データを使用する SQL クエリとSELECT
、フィールドの 1 つは、[Cat_Entries]
セル ラベルとして使用されるハード コードされた値です。Cat_Entries の値は、COUNT(EventGUID)
および/またはCAST(SUM(Duration) AS varchar(10)) AS TotalRepairTime
同じ文で計算されます。
以下のステートメントから、出力を生成するために 3 つのクエリのいずれかが使用されてSELECT
いることがわかります。UNION
ただし、「サブクエリ」が計算の結果として値を返さない場合。ただし、要件は [Cat_Entries]
、値に関係なくラベルを表示することです。
データは次のようになります。
Cat Cat Entries 6/1/2012 7/1/2012 8/1/2012 9/1/2012
------ -------------------- -------- -------- -------- --------
00000A Critical Down Time 1
00000A Critical Outage 1
00000A Total Repair Time 65
00000B Critical Down Time 6
00000B Total Repair Time 90
00000C Critical Down Time 1 5
00000C Critical Outage 1 5
00000C Total Repair Time 30 240
00000D Critical Down Time 2
00000E Critical Down Time 1
00000G Critical Down Time 1
00000M Critical Down Time 1 3
00000M Critical Outage 1 3
00000M Total Repair Time 60 180
...そして、これは目的の出力がどのように見えるかです (** 挿入された空の行を示します):
Cat Cat Entrie s 6/1/2012 7/1/2012 8/1/2012 9/1/2012
------ -------------------- -------- -------- -------- --------
00000A Critical Down Time 1
00000A Critical Outage 1
00000A Total Repair Time 65
00000B Critical Down Time 6
** 00000B Critical Outage
00000B Total Repair Time 90
00000C Critical Down Time 1 5
00000C Critical Outage 1 5
00000C Total Repair Time 30 240
00000D Critical Down Time 2
** 00000D Critical Outage
** 00000D Total Repair Time
これがsprocPIVOT
です:
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + cast([Year] as varchar(4))
FROM vCatCountByMonthYear where SiteGUID = @SiteGuid
and [Year] BETWEEN @StartDate AND @StopDate ORDER BY '],[' + cast([Year] as varchar(4))
FOR XML PATH('') ), 1, 2, '') + ']'
SET @query = N'SELECT Cat,[Cat_Entries], ' + @cols +' FROM (SELECT Cat,[Year],
[Cat_Entries],Value,OrderBy FROM vCatCountByMonthYear
where SiteGUID = ' + CHAR(39) + CONVERT(nvarchar(36), @SiteGuid) + CHAR(39) + ' and
[Year] BETWEEN ' + CHAR(39) + @StartDate + CHAR(39) + ' AND ' + CHAR(39) +
@StopDate + CHAR(39) + ' ) p PIVOT ( Sum ([Value] ) FOR [Year] IN ( '+ @cols +' ) )
AS pvt ORDER BY Cat,OrderBy'
execute(@query)
... VIEW
sproc が使用するのは次のとおりです。
SELECT SiteGUID, Cat_Entries, EntriesCount AS Value,
CONVERT(date, CAST(Month AS varchar(2)) + '-1-' + CAST(Year AS varchar(4))) AS MonthYear,
Month, Year, OrderBy, Cat, EventId
FROM (SELECT SiteGUID, 'Critical Down Time' AS Cat_Entries, COUNT(EventGUID) AS EntriesCount,
Month, Year, 1 AS OrderBy, Cat, EventId
FROM dbo.vCatCountTotalEntries
GROUP BY SiteGUID, Month, Year, Cat, EventId
UNION
SELECT SiteGUID, 'Critical Outage' AS Cat_Entries, COUNT(EventGUID) AS EntriesCount,
Month, Year, 2 AS OrderBy, Cat, EventId
FROM dbo.vCatCountEqpEntries
GROUP BY SiteGUID, Cat, Month, Year, Cat, EventId
UNION
SELECT SiteGUID, 'Total Repair Time' AS Cat_Entries,
CAST(SUM(Duration) AS varchar(10)) AS TotalRepairTime, Month, Year, 3 AS OrderBy,
Cat, EventId
FROM dbo.vCatCountOnEqpRprTm
GROUP BY SiteGUID, Cat, Month, Year, Cat, EventId) AS W
いつものように、あなたの時間と努力に感謝します! R.