读书人

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

发布时间: 2013-01-11 11:57:35 作者: rapoo

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

读书人网 >SQL Server

热点推荐