首页 新闻 赞助 找找看

SQL 行转列的问题

0
悬赏园豆:100 [待解决问题]

大神们,我现在遇到了一个比较棘手的报表 简单的说 就是行转列,废话不多说 大致的结构如下:

厂商   数量    单价   合计   材料
厂商1   1     200   200   M04.02.04.01
厂商1   3     400   1200   M04.02.04.02
厂商2   2     300   600   M04.02.04.02
厂商2   4         500      2000     M04.02.04.01

就是一张很简单的表,现在需要转换成 

             厂商1                厂商2  
材料       数量      单价    合计    数量     单价    合计
M04.02.04.01  1      200    200     4     300    1200
M04.02.04.02  3      400    1200    2     300   600

根据材料分组 ,然后动态查出 各个厂商的 数量,单价,合计 

单独查一列我会查,这里差3列 请大神指点一下 如何做?

Damon.Liu的主页 Damon.Liu | 初学一级 | 园豆:86
提问于:2013-10-31 14:03
< >
分享
所有回答(8)
0

那要有100个厂家就要查出301列????

会长 | 园豆:12401 (专家六级) | 2013-10-31 14:06

是的

支持(0) 反对(0) Damon.Liu | 园豆:86 (初学一级) | 2013-10-31 14:09
0

用union all~~~

ex:

with s as(

select ..., ..., flag = '1' from dbo.test where 工厂 = '工厂1';

union all

select ..., ..., flag = '2' from dbo.test where 工厂 = '工厂2';

union all

select ..., ..., flag = '3' from dbo.test where 工厂 = '工厂3';

)

select * from s;

eatpockyboy | 园豆:260 (菜鸟二级) | 2013-10-31 14:12

呵呵 谢谢你的回答 ,回答前 请看清问题 谢谢

支持(0) 反对(0) Damon.Liu | 园豆:86 (初学一级) | 2013-10-31 14:23

妹子的。。。居然被减一了。。。楼主要的是三维的数据,但是现在只有两个维度 除了多加一列标记列之外有其他办法吗? 除非用浮标 否则一条语句想出结果真的没什么可能了。。。减一的这么犀利就给另外的解决方案啊。。。这样随便减一 太过分了。。。

支持(0) 反对(0) eatpockyboy | 园豆:260 (菜鸟二级) | 2013-10-31 14:25
2

这个的行转列,只有拼接语句了。因为列不固定。sQL关键字pivot。

幻天芒 | 园豆:37175 (高人七级) | 2013-10-31 14:30

 呀 还有这招~ 涨姿势了。。。

支持(0) 反对(0) eatpockyboy | 园豆:260 (菜鸟二级) | 2013-10-31 14:41
1
悟行 | 园豆:12559 (专家六级) | 2013-10-31 14:46
0
li-peng | 园豆:954 (小虾三级) | 2013-10-31 17:26
0

你说的是在 SQL 中解决还是在报表中解决?如果在报表中解决的话,SSRS 中可以用 Tablix 来搞定,动态的增长 Column。 SQL 查询不支持你这种双层列头的,这是多维的概念了。

一般的 SQL 行转列可以参照我之前写的一个小例子 http://www.cnblogs.com/biwork/archive/2013/01/07/2849422.html

BIWORK | 园豆:156 (初学一级) | 2013-11-01 17:28
0

像这种数据最好别用SQL去实现,太耗性能了,你可以直接把表的数据读出来,然后用 用C#/C++/Java等等这些语言去循环一次就可以实现了

华安 | 园豆:226 (菜鸟二级) | 2013-11-04 16:02
0

双层列头的不会, 简化成单层的试了一下

DECLARE compName_Cursor CURSOR FORWARD_ONLY FOR
SELECT DISTINCT CompanyName FROM test
OPEN compName_Cursor

DECLARE @compName NVARCHAR(20),
        @st NVARCHAR(MAX),
        @stx NVARCHAR(MAX)
    
FETCH NEXT FROM compName_Cursor INTO @compName
WHILE @@FETCH_STATUS=0
BEGIN   
   SELECT @stx = 'MAX(CASE WHEN T.CompanyName ='''+ @compName + ''' THEN T.OrderCount END) AS ' + '['+       
       CONVERT(NVARCHAR(50),@compName)+ '_OrderCount' + ']'+',' 
        +'MAX(CASE WHEN T.CompanyName =''' + @compName + ''' THEN T.UnionPrice END) AS ' + '['+
        CONVERT(NVARCHAR(50),@compName) +'_UnionPrice' + ']'+',' +
      'MAX(CASE WHEN T.CompanyName =''' +@compName +''' THEN T.SumPrice END) AS ' +'['+ 
      CONVERT(NVARCHAR(50), @compName )+'_SumPrice' + ']' 
   FROM (SELECT DISTINCT CompanyName FROM test) AS T   
   
   FETCH NEXT FROM compName_Cursor INTO @compName
   SELECT @st = ISNULL(@st+',', +'')+ @stx
END

CLOSE compName_Cursor
DEALLOCATE compName_Cursor

SELECT @st = '
  SELECT T.Material,' + @st + ' FROM test AS T
  OUTER APPLY (
   SELECT ''OrderCount'', OrderCount UNION ALL
   SELECT ''UnionPrice'', UnionPrice UNION ALL
   SELECT ''SumPrice'', SumPrice  
  ) AS TP(Name, Value)
GROUP BY Material';

EXEC sp_executesql @st=@st;
GO

可以得到结果

 

百花宫 | 园豆:224 (菜鸟二级) | 2013-11-05 17:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册