Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Sql Server_Tsql_Pivot - Fatal编程技术网

SQL server中的透视表问题

SQL server中的透视表问题,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,--枢轴的使用 create table newtest ( Section varchar(50), Department varchar(50), salesamount float ) Insert into newtest select 'Sec1','IT',2000.89 union select 'Sec1','IT',1000.89 union select 'Sec1','IT',3000.89 union select 'Sec1','BPO',2000.89

--枢轴的使用

create table newtest (
  Section varchar(50),
  Department varchar(50), 
  salesamount float
)

Insert into newtest
select 'Sec1','IT',2000.89 union
select 'Sec1','IT',1000.89 union
select 'Sec1','IT',3000.89 union
select 'Sec1','BPO',2000.89 union
select 'Sec2','BPO',5000.89 union
select 'Sec2','IT',2700.89 union
select 'Sec2','BPO',2000.89 union
select 'Sec3','IT',6000.89 union
select 'Sec3','IT',2000.89 union
select 'Sec3','BPO',9000.89 union
select 'Sec4','IT',2000.89 union
select 'Sec4','BPO',6000.89 union
select 'Sec3','BPO',1000.89 union
select 'Sec4','IT',3000.89

select * from newtest

  Select section, department, SUM(salesamount) 
    from newtest 
Group by Section, Department
请帮助我解决这个问题…我在执行上述代码时得到了结果

select [Sec1] AS Sec1BPO,
       [Sec2] AS Sec2BPO,
       [Sec3] AS Sec3BPO,
       [Sec4] AS Sec4BPO,
       [Sec1] AS Sec1IT,
       [Sec2] AS Sec2IT,
       [Sec3] AS Sec3IT,
       [Sec4] AS Sec4IT
  from (select Section, Department, salesamount 
          from newtest) as Sourcetable
 PIVOT( SUM([salesamount])
      FOR [Section] IN ([Sec1],[Sec2],[Sec3],[Sec4]) ) AS Pivottable
ORDER BY Department
但我需要

Sec1BPO  Sec2BPO  Sec3BPO   Sec4BPO  Sec1IT   Sec2IT   Sec3IT    Sec4IT
-------------------------------------------------------------------------
2000.89  7001.78  10001.78  6000.89  2000.89  7001.78  10001.78  6000.89
6002.67  2700.89  8001.78   5001.78  6002.67  2700.89  8001.78   5001.78
请帮我得到想要的结果

Sec1BPO  Sec2BPO  Sec3BPO   Sec4BPO  Sec1IT   Sec2IT   Sec3IT   Sec4IT
-----------------------------------------------------------------------
2000.89  7001.78  10001.78  6000.89  6002.67  2700.89  8001.78  5001.78
要查看它是否正常工作,请转到Data.SE查询

注意我使用了一个表变量而不是表,因为createtable在Data.SE上不起作用

输出

;WITH CTE AS (
select 
       Department,
       [Sec1]  ,
       [Sec2] ,
       [Sec3] ,
       [Sec4] 
  from (select Section, Department, salesamount 
          from @newtest) as Sourcetable
 PIVOT( SUM([salesamount])
      FOR [Section] IN ([Sec1],[Sec2],[Sec3],[Sec4]) ) AS Pivottable
)
SELECT 
    a.sec1 Sec1bpo, a.sec2 sec2bpo, a.sec3 sec3bpo, a.sec4 sec4bpo,
    b.sec1 Sec1it, b.sec2 sec2it, b.sec3 sec3it, b.sec4 sec4it
FROM 
    cte a, cte b
WHERE
   a.department = 'BPO' and B.department = 'it'​

您可以尝试以下方法:

Sec1bpo sec2bpo sec3bpo  sec4bpo Sec1it  sec2it  sec3it  sec4it  
------- ------- -------- ------- ------- ------- ------- ------- 
2000.89 7001.78 10001.78 6000.89 6002.67 2700.89 8001.78 5001.78 
select Sec1BPO,
       Sec2BPO,
       Sec3BPO,
       Sec4BPO,
       Sec1IT,
       Sec2IT,
       Sec3IT,
       Sec4IT
  from (select Section + Department AS SectDept, salesamount 
          from newtest) as Sourcetable
 PIVOT( SUM([salesamount])
      FOR SectDept IN (Sec1BPO, Sec2BPO, Sec3BPO, Sec4BPO,
                       Sec1IT,  Sec2IT,  Sec3IT,  Sec4IT) ) AS Pivottable
ORDER BY 1

更新

只需提醒一句——上述解决方案在一般情况下应用时,可能会使您面临将不打算这样做的数据汇总在一起的风险。也就是说,以您当前的示例为例,如果它包含同时包含
Sec1
BPO
Sec1B
PO
的行,作为
部分
部门
的组合,那么这两个组合最终将被连接为
Sec1BPO
,并因此加在一起,这显然是错误的

因此,在连接部件以排除此类重复项时,可能应该使用一些分隔符,如空格或已知的其他字符,这些字符肯定不会出现在要连接的值中。我的意思是这样的:

Sec1bpo sec2bpo sec3bpo  sec4bpo Sec1it  sec2it  sec3it  sec4it  
------- ------- -------- ------- ------- ------- ------- ------- 
2000.89 7001.78 10001.78 6000.89 6002.67 2700.89 8001.78 5001.78 
select Sec1BPO,
       Sec2BPO,
       Sec3BPO,
       Sec4BPO,
       Sec1IT,
       Sec2IT,
       Sec3IT,
       Sec4IT
  from (select Section + Department AS SectDept, salesamount 
          from newtest) as Sourcetable
 PIVOT( SUM([salesamount])
      FOR SectDept IN (Sec1BPO, Sec2BPO, Sec3BPO, Sec4BPO,
                       Sec1IT,  Sec2IT,  Sec3IT,  Sec4IT) ) AS Pivottable
ORDER BY 1

(感谢@Conrad Frix提出这个问题。)

+1当然是要走的路,但您可能需要注意的是,
Section+Department
可能会导致某些数据的正确性问题。添加分隔符
Section+'|'+Department
可以解决that@Conrad弗里克斯:你说得对。我根本没有想到这个想法,因为OP的例子似乎不能引起这样的问题。不过,我们还是应该增加警惕,现在已经做到了。谢谢你的来信。