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

在SQL Server中翻转数据

在SQL Server中翻转数据,sql,sql-server,Sql,Sql Server,我有表a Name District Source Revenue Dave 34 A 120 John 36 B 140 Juyt 38 C 170 和表b Name District Product Cost Dave 34 A 50 John 36 B 40 我想要这样的景色。下面是所需的视图 Name District Source R

我有
表a

Name  District Source  Revenue
Dave   34       A       120
John   36       B       140
Juyt   38       C       170 
表b

Name District Product Cost
Dave  34       A        50
John  36       B        40
我想要这样的景色。下面是所需的视图

Name  District Source  Revenue  A    B   Total Cost 
Dave   34       A       120     50   0     50
John   36       B       140     0    40    40 
Juyt   38       C       170     0    0     0

表b中每次查找的产品数量不是固定的。当产品a、产品B等产品的数量不固定时,是否有取消PIVOT的方法。我不想做动态SQL和动态unpivot。是否有任何其他选项可以获得所需的视图?

基于您的示例数据,我已经为您提供了输出

declare @t table (name varchar(10),District int,Source varchar(2),Revenue int)
insert into @t (name,District,Source,Revenue)values ('dave',34,'A',120),
('john',36,'B',140),('juyt',38,'C',170)

declare @tt table (name varchar(10),District int,product varchar(2),cost int)
insert into @tt (name,District,product,cost)values ('dave',34,'A',50),
('john',36,'B',40)


select A.name,A.District,A.Source,A.Revenue,A.A,A.B,
SUM(A + B) TotalCost from  (
select t.name,
t.District,
t.Source,
t.Revenue,
CASE WHEN tt.product = 'A' THEN cost ELSE 0 END A ,
CASE WHEN tt.product = 'B' THEN cost ELSE 0 END B 
 from @t t
 left join @tt tt on 
 t.name = tt.name 
 AND 
 t.District = tt.District )A
 GROUP BY A.name,A.District,A.Source,A.Revenue,A.A,A.B

您会问:“是否有其他选项可以获得所需的视图?”否。当透视中的列数不确定时,动态SQL是唯一的选择。您基本上是问是否有一种方法可以执行透视,而无需单独命名列,也无需使用动态SQL。我同意你的想法,真的希望有更好的选择,但不幸的是,以前有人问过这一点,我在这里得到了回答:“有没有一种方法可以不使用动态SQL而取消生成一组动态类别?”是的。但T-SQL却不行。Excel(和其他工具)可以很好地做到这一点。如果您想在SQL Server上实现这一点,那么正如其他人所说,您需要动态SQL.Yep,而诸如SQL Server Analysis Services之类的OLAP数据库专门使用不同的方法进行分组和数据透视。如果你打算做很多这类事情,它们是好的,但是对于一次性查询来说,这是过分的。当我们打算使用左连接和派生表@Ssis魔术师2014来实现这一点时,为什么要使用unpivot呢