sql-server - 将一行转换为列

标签 sql-server sql-server-2005

这是我的查询。这显示了屏幕截图中描述的结果。现在我想改变它,让它在列中显示当月的雕像。

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

我认为这张图片可以很好地描述我所需要的。

enter image description here

请告诉我如何按月份名称对其进行排序...例如。一月、二月、三月、六月、十二月。等等

谢谢。

最佳答案

查看数据透视表;

参见 http://msdn.microsoft.com/en-us/library/ms177410.aspx

对有限数量的 StatusTypeName 的简单查询类似于;

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)

它并不完全正确,但它是一个起点。

祝你好运。

关于sql-server - 将一行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6421437/

相关文章:

sql-server - 在 SQL Server 中如何处理列名中的空格?

sql-server-2005 - SQL 搜索另一个表中的行

tsql - 在逗号上拆分sql参数

出勤时间的 SQL 查询

用于发送电子邮件的 SQL Server 存储过程

sql-server - 在文本列中搜索字符串并列出计数

sql - 选择计数(*);

c# - 本地 ASP.NET MVC 突然变慢;加载时间 > 1 分钟

sql-server - SQL Server 2005 中的 XML?在 Varchar 中比 JSON 更好?

sql-server - SQL Server : catch every error within a database into error table