大神们,我现在遇到了一个比较棘手的报表 简单的说 就是行转列,废话不多说 大致的结构如下:
厂商 数量 单价 合计 材料
厂商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列 请大神指点一下 如何做?
那要有100个厂家就要查出301列????
是的
用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;
呵呵 谢谢你的回答 ,回答前 请看清问题 谢谢
妹子的。。。居然被减一了。。。楼主要的是三维的数据,但是现在只有两个维度 除了多加一列标记列之外有其他办法吗? 除非用浮标 否则一条语句想出结果真的没什么可能了。。。减一的这么犀利就给另外的解决方案啊。。。这样随便减一 太过分了。。。
这个的行转列,只有拼接语句了。因为列不固定。sQL关键字pivot。
呀 还有这招~ 涨姿势了。。。
你说的是在 SQL 中解决还是在报表中解决?如果在报表中解决的话,SSRS 中可以用 Tablix 来搞定,动态的增长 Column。 SQL 查询不支持你这种双层列头的,这是多维的概念了。
一般的 SQL 行转列可以参照我之前写的一个小例子 http://www.cnblogs.com/biwork/archive/2013/01/07/2849422.html
像这种数据最好别用SQL去实现,太耗性能了,你可以直接把表的数据读出来,然后用 用C#/C++/Java等等这些语言去循环一次就可以实现了
双层列头的不会, 简化成单层的试了一下
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
可以得到结果