要进行下列变换,不知道怎么实现
本帖最后由 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
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)