遇到这个问题我想帮助我解决一些问题。我认为在程序代码中解决问题会更容易,但我开始重新思考这个问题。
使用PIVOT
的SQL查询从SELECT
语句中提取数据,其中一个字段[Cat_Entries]
是用作单元格标签的硬编码值。 Cat_Entries的值是使用COUNT(EventGUID)
和/或CAST(SUM(Duration) AS varchar(10)) AS TotalRepairTime
计算得出的。
从下面的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
以下是包含PIVOT
:
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)
...这是sproc使用的VIEW
:
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上。
答案 0 :(得分:0)
因此,为了获得额外的行,您的主要选择查询必须能够对其进行说明,这意味着您无法将其过滤掉。
您目前在startdate和stopdate之间执行[Year],因此您的初始结果集只会包含您日期之间的值。不要限制它,让你的PIVOT为你做限制。
因此,您应该做的唯一改变就是将您的年份过滤器从主要选择中删除,我相信您应该看到您正在寻找的结果。
这是一个说明我的意思的例子:
CREATE TABLE #years(year_name VARCHAR(20), year_actual int)
--Insert three years
INSERT INTO #years
( year_name, year_actual )
SELECT 'rat', -- year_name - varchar(20)
1924 -- year_actual - int
UNION ALL
SELECT 'ox',
1925
UNION ALL
SELECT 'tiger',
1926
--I only care about two of those years
SELECT year_name, [1924], [1925]
FROM
--I need to select all the years so that all three rows show
(SELECT year_name, year_actual FROM #years) yr
PIVOT
--Here I select the years I actually care to count
(COUNT(year_actual) FOR year_actual IN ([1924], [1925])) pvt
结果:
--Now I pulled all three rows, with 'dragon' having zero rows
ox 0 1
rat 1 0
tiger 0 0