Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中基于列的值展平表?_Sql Server_Pivot Table - Fatal编程技术网

Sql server 如何在SQL Server中基于列的值展平表?

Sql server 如何在SQL Server中基于列的值展平表?,sql-server,pivot-table,Sql Server,Pivot Table,我有一个表,其中每个用户每周都做一些活动,例如,用户1在=1的第周做一些活动,然后在=2的第周做一些活动……) 用户数量超过30000 我看到了类似的问题,但我的表结构与此不同 user_id | total_video_time | problem_counts | week_of --------+------------------+----------------+-------- 1 | 0 | 99 | 1 2

我有一个表,其中每个用户每周都做一些活动,例如,用户1在=1的第周做一些活动,然后在=2的第周做一些活动……) 用户数量超过30000

我看到了类似的问题,但我的表结构与此不同

user_id | total_video_time | problem_counts | week_of
--------+------------------+----------------+--------
   1    |      0           |     99         |  1
   2    |    234           |      5         |  1
   1    |   4150           |      9         |  2
   2    |    142           |     16         |  2
   3    |    236           |     40         |  2  
   1    |    649           |     17         |  3
   3    |    500           |     78         |  3
...
...
...
2       |102               |96             |48
3       |147               |43             |48

我想根据
week\u的
值水平展平它,以创建一个视图

有人能帮我写一个查询吗

user_id | week_of_1_total_video_time |  week_of_1_problem_counts | .... | week_of_48_total_video_time |  week_of_48_problem_counts
--------|----------------------------|---------------------------|------| ---------------------------|--------------------
我编写了以下代码,但出现了一些错误:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(week_of) 
                    from [dbo].[View_1]
                    order by week_of
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT user_id,' + @cols + ' from 
             (
                select total_video_time, problem_counts, week_of
                from [dbo].[View_1]
            ) x
            pivot 
            (
                total_video_time, problem_counts
                for week_of in (' + @cols + ')
            ) p '

execute(@query);

我的错误是:

The number of elements in the select list exceeds the maximum allowed number of 4096 elements.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'x'.

以下是第1周和第2周的查询。您可以根据需要添加更多其他列

WITH your_table(user_id,total_video_time,problem_counts,week_of)
AS
(
    SELECT 1,0 ,99,1 UNION ALL
    SELECT 2,234,5,1  UNION ALL
    SELECT 1,4150,9,2  UNION ALL
    SELECT 2,142 ,16,2 UNION ALL
    SELECT 3,236 ,40,2   UNION ALL
    SELECT 1,649 ,17,3 UNION ALL
    SELECT 3,500 ,78,3 UNION ALL
    SELECT 2,102,96,48  UNION ALL
    SELECT 3,147,43,48

)

SELECT user_id,

SUM(CASE WHEN week_of = 1 THEN total_video_time ELSE 0 END) week_of_1_total_video_time ,
SUM(CASE WHEN week_of = 1 THEN problem_counts ELSE 0 END) week_of_1_total_problem_counts,

SUM(CASE WHEN week_of = 2 THEN total_video_time ELSE 0 END) week_of_2_total_video_time ,
SUM(CASE WHEN week_of = 2 THEN problem_counts ELSE 0 END) week_of_2_total_problem_counts

FROM your_table
GROUP BY user_id

这是一个透视表查询。Google:
sql server中的pivot表
我没有使用过它,你能指导我如何编写它的查询吗?我担心为你编写代码超出了我认为应该提供的范围。按照谷歌的搜索结果-有几个伟大的例子,如何实现这一点。一旦你尝试过(也许失败了),带着一个具体的问题回来,我(和其他人)会很乐意帮助你
WITH your_table(user_id,total_video_time,problem_counts,week_of)
AS
(
    SELECT 1,0 ,99,1 UNION ALL
    SELECT 2,234,5,1  UNION ALL
    SELECT 1,4150,9,2  UNION ALL
    SELECT 2,142 ,16,2 UNION ALL
    SELECT 3,236 ,40,2   UNION ALL
    SELECT 1,649 ,17,3 UNION ALL
    SELECT 3,500 ,78,3 UNION ALL
    SELECT 2,102,96,48  UNION ALL
    SELECT 3,147,43,48

)

SELECT user_id,

SUM(CASE WHEN week_of = 1 THEN total_video_time ELSE 0 END) week_of_1_total_video_time ,
SUM(CASE WHEN week_of = 1 THEN problem_counts ELSE 0 END) week_of_1_total_problem_counts,

SUM(CASE WHEN week_of = 2 THEN total_video_time ELSE 0 END) week_of_2_total_video_time ,
SUM(CASE WHEN week_of = 2 THEN problem_counts ELSE 0 END) week_of_2_total_problem_counts

FROM your_table
GROUP BY user_id