首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

要进行上列变换,不知道如何实现

2013-01-11 
要进行下列变换,不知道怎么实现本帖最后由 Miracle_Lee 于 2012-09-05 22:12:22 编辑要实现下列变换, 请问

要进行下列变换,不知道怎么实现
本帖最后由 Miracle_Lee 于 2012-09-05 22:12:22 编辑 要实现下列变换, 请问如何实现
ModelstatusLineALineBlineC
AFAIL900
APASS1000
APASS1200
BFAIL090
BFAIL020
BPASS050
CFAIL090
CFAIL070
CPASS060
status只有PASS和FAIL两种情况,变换后将Model和status相同的数量相加,然后在将Status 和LineA,Line,lineC进行组合,变成,得到下面的这组数据,请问下SQL语句如何写
ModelLineA_PASSlineA_FAILLineB_PASSLineB_FAILLineC_PASSLine_CFAIL
A22    9    0    0    0    0
B0    0    5    11    0    0
C0    0    0    0    6    16

[解决办法]


-->try
select Model,
 status,
 LineA_PASS=(case when Model='A' and status='PASS' then LineA else 0 end),
 LineA_FAIL=(case when Model='A' and status='FAIL' then LineA else 0 end),
 LineB_PASS=(case when Model='B' and status='PASS' then LineB else 0 end),
 LineB_FAIL=(case when Model='B' and status='FAIL' then LineB else 0 end),
 LineC_PASS=(case when Model='C' and status='PASS' then LineC else 0 end),
 LineC_FAIL=(case when Model='C' and status='FAIL' then LineC else 0 end)
from
(
 select Model,status,sum(LineA) LineA,sum(LineB) LineB,sum(LineC) LineC
 from 表
 group by Model,status
)t 

[解决办法]
select Model,
 status,
 LineA_PASS=sum(case when Model='A' and status='PASS' then LineA else 0 end),
 LineA_FAIL=sum(case when Model='A' and status='FAIL' then LineA else 0 end),
 LineB_PASS=sum(case when Model='B' and status='PASS' then LineB else 0 end),
 LineB_FAIL=sum(case when Model='B' and status='FAIL' then LineB else 0 end),
 LineC_PASS=sum(case when Model='C' and status='PASS' then LineC else 0 end),
 LineC_FAIL=sum(case when Model='C' and status='FAIL' then LineC else 0 end)
from
tb

[解决办法]
很遗憾,楼上的结果都不对
USE tempdb
 GO
 CREATE TABLE test 
 (
 ModelCHAR(2),
 statusCHAR(4),
 LineAINT ,
 LineBINT,
 lineC INT 
 )
 INSERT INTO test
 
 SELECT 'A','FAIL',9,0,0
 UNION ALL 
 SELECT 'A','PASS',10,0,0
 UNION ALL 
 SELECT 'A','PASS',12,0,0
 UNION ALL 
 SELECT 'B','FAIL',0,9,0
 UNION ALL 
 SELECT 'B','FAIL',0,2,0
 UNION ALL 
 SELECT 'B','PASS',0,5,0
 UNION ALL 
 SELECT 'C','FAIL',0,9,0
 UNION ALL 
 SELECT 'C','FAIL',0,7,0
 UNION ALL 
 SELECT 'C','PASS',0,6,0
 
 
 SELECT Model, 


  LineA_PASS=SUM(CASE WHEN Model='A' AND status='PASS' THEN LineA ELSE 0 END),
  LineA_FAIL=SUM(CASE WHEN Model='A' AND status='FAIL' THEN LineA ELSE 0 END),
  LineB_PASS=SUM(CASE WHEN Model='B' AND status='PASS' THEN LineB ELSE 0 END),
  LineB_FAIL=SUM(CASE WHEN Model='B' AND status='FAIL' THEN LineB ELSE 0 END),
  LineC_PASS=SUM(CASE WHEN Model='C' AND status='PASS' THEN LineC ELSE 0 END),
  LineC_FAIL=SUM(CASE WHEN Model='C' AND status='FAIL' THEN LineC ELSE 0 END)
 FROM
 (
  SELECT Model,status,SUM(LineA) LineA,SUM(LineB) LineB,SUM(LineC) LineC
  FROM test
  GROUP BY Model,status
 )t 
 GROUP BY Model
 


结果;
Model LineA_PASS  LineA_FAIL  LineB_PASS  LineB_FAIL  LineC_PASS  LineC_FAIL
 ----- ----------- ----------- ----------- ----------- ----------- -----------
 A     22          9           0           0           0           0
 B     0           0           5           11          0           0
 C     0           0           0           0           0           0
 
 (3 行受影响)
[解决办法]
引用:
这里我只是举个例子,Model可能会有很多,远不止A,B,C这三个

用动态sql就可以了

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+'Line'+ltrim(rtrim(Model))+'_PASS=sum(case when Model='''+ltrim(rtrim(Model))+''' and status=''PASS'' then Line'+ltrim(rtrim(Model))+' else 0 end),'
++'Line'+ltrim(rtrim(Model))+'_FAIL=sum(case when Model='''+ltrim(rtrim(Model))+''' and status=''FAIL'' then Line'+ltrim(rtrim(Model))+' else 0 end)'
from (select distinct Model from 你的表)t
set @sql='select Model,'+@sql+' from 你的表 group by Model'
--print @sql
exec(@sql)

热点排行
Bad Request.