这是我的查询。这显示了屏幕截图中描述的结果。现在我想改变它,以便在列中显示月份的雕像。
DECLARE @temp TABLE
(
MonthName VARCHAR(10),
[Year] VARCHAR(10),
StatusTypeId INT,
StatusTypeName VARCHAR(50),
StatusCount INT
)
INSERT INTO @temp
SELECT
CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) as MonthName,
datepart(yyyy, w.ExpectedStartDate) as [Year],
w.StatusTypeId,
st.StatusTypeName,
COUNT(ISNULL(w.StatusTypeId, 0)) AS StatusCount
FROM
Worksheet w LEFT OUTER JOIN
StatusType st ON st.StatusTypeId = w.StatusTypeId
WHERE w.ProjectId = 20
AND CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)) between ('feb') AND ('mar')
GROUP BY
datepart(yyyy, w.ExpectedStartDate),
CONVERT(varchar(3), DATENAME(month, w.ExpectedStartDate)),
w.StatusTypeId,
st.StatusTypeName
SELECT ISNULL(((CONVERT(VARCHAR(5), [Year])) + '-' + MonthName), 'Unknown') AS MonthName,
ISNULL(StatusTypeName, 'Unknown') AS StatusTypeName,
StatusCount
FROM @temp
我认为这张图片能很好地描述我需要的东西。
请让我知道如何按月名称排序..例如。 Jan,feb,mar,jun,dec。等等
感谢。
答案 0 :(得分:2)
查看数据透视表;
请参阅http://msdn.microsoft.com/en-us/library/ms177410.aspx
对有限数量的StatusTypeNames进行简单查询就像是;
SELECT * FROM
(SELECT MonthName, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ([ToBeScheduled],[Complete])) as pvt
ORDER BY MonthName
注意使用MAX。如果有可能您有多个具有相同月份名和状态类型名称组合的行,那么您可能希望使用SUM。
要像madhivinan所建议的那样使用动态列,您可以按this example.滚动到底部。
我试图让它与你的例子一起工作,但因为我有几个问题可能是因为我没有表格。但是,您所追求的是以下内容。
DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)
SELECT @listCol = SELECT STUFF (( SELECT DISTINCT '],[' +
StatusTypeName FROM @ResultsTable ORDER BY '],[' +
StatusTypeName FOR XML PATH ('')), 1, 2, '') + ']'
SET @query =
'SELECT * FROM
(SELECT MonthNameCol, StatusTypeName as attributeCol, StatusCount FROM @ResultsTable) rt
PIVOT ( MAX(StatusCount) FOR attributeCol in ('+@listCol+')) AS pvt ORDER BY MonthNameCol'
EXECUTE (@query)
这不完全正确,但这是一个起点。
祝你好运。答案 1 :(得分:0)