首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择行对列SQL。

选择行对列SQL。
EN

Stack Overflow用户
提问于 2015-08-04 03:49:19
回答 1查看 122关注 0票数 1

我以前没见过一排排的人,你能帮我吗?

这是我的资料来源的例子。

我想从中选择:

代码语言:javascript
复制
Id  Project ID  Date      Hour
-------------------------------
1   Project-1   1/1/2010    10
2   Project-1   1/2/2010     2
3   Project-1   1/3/2010     3
4   Project-1   1/4/2010     5
5   Project-2   1/1/2010     3
6   Project-2   1/2/2010     4
7   Project-2   1/3/2010     2
8   Project-2   1/4/2010     7
9   Project-3   1/1/2010     5
10  Project-3   1/2/2010     6
11  Project-3   1/3/2010     4
.
.
.

代码语言:javascript
复制
Project ID  1/1/2010    1/2/2010    1/3/2010    1/4/2010    ...
----------------------------------------------------------------
Project-1     10          2            3           5
Project-2     3           4            2           7
Project-3     5           6            4    

请帮帮我。

更新

这是我的解决方案。

代码语言:javascript
复制
--==============  Create stored procedure ============
if exists(select * from sys.procedures where name='usp_ProjectFollow')
    drop procedure usp_ProjectFollow
go

create proc usp_ProjectFollow 
as
begin
    DECLARE @cols AS NVARCHAR(MAX), 
            @query  AS NVARCHAR(MAX)
    Declare @ParamDefinition AS NVarchar(MAX) 
    SELECT @cols = STUFF((SELECT ',' + QUOTENAME([Date]) 
    FROM MyTable
    group by [Date]
    order by [Date]
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')    

    set @query = 'SELECT id, ProjectName, ProjectCode, ' + @cols +  
            ' FROM MyTable
            pivot 
            (
                sum(Hour)
                for Date in (' + @cols + ')
            ) p '
            --print @query
     execute sp_Executesql @query


end
go

希望它能帮助需要帮助的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-04 04:13:22

静态解决方案使用这种类型的查询:

代码语言:javascript
复制
SELECT
    ProjectID,
    SUM(CASE WHEN Date = '1/1/2010' THEN Hour ELSE 0 END) As '1/1/2010',
    SUM(CASE WHEN Date = '1/2/2010' THEN Hour ELSE 0 END) As '1/2/2010',
    SUM(CASE WHEN Date = '1/3/2010' THEN Hour ELSE 0 END) As '1/3/2010',
    SUM(CASE WHEN Date = '1/4/2010' THEN Hour ELSE 0 END) As '1/4/2010',
    ...
FROM
    yourTable
GROUP BY
    ProjectID;

对于使用动态解决方案,需要使用如下动态SQL:

代码语言:javascript
复制
Declare @SQL nvarchar(MAX)

SELECT @SQL = ISNULL(@SQL, 'SELECT ProjectID') + ', SUM(CASE WHEN Date = ''' + [Date] + ''' THEN [Hour] ELSE 0 END) As [' + [Date] + ']'
FROM @t
GROUP BY [Date]

SELECT @SQL = @SQL + ' FROM yourTable GROUP BY ProjectID;'

EXEC(@SQL)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31800353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档