一个sql中常遇到的表结构转换问题

      FD程序开发 2007-6-19 16:29

score表结构如

name  subject  score
-----------------------------------
大都    语文     59
大都    数学     78
大都    外语     89
大都    物理     98
小都    语文     90
小都    外语     80
小都    物理     70
德国    语文     90
德国    数学     50
德国    外语     80
德国    物理     89
哈哈    语文     99
哈哈    数学     80
哈哈    物理     89

现需转换成表结构如:

姓名 数学 外语 物理 语文
-----------------------------------------
大都   78    89     98     59
德国   50    80     89     90
哈哈   80    0       89     99
小都   0      80     70     90


解决之道:

--当出现的subject的个数不定的时候

declare @sql varchar(8000)
set @sql='SELECT name as 姓名'
select @sql=@sql+',['+subject+']=MAX(CASE subject WHEN '''+subject+''' THEN score ELSE 0 END)' from score group by subject
exec(@sql+' FROM score GROUP BY name')

--当出现的subject的个数确定的时候

select name as 姓名,
数学=MAX(CASE WHEN subject='数学' THEN score ELSE 0 END),
外语=MAX(CASE WHEN subject='外语' THEN score ELSE 0 END),
物理=MAX(CASE WHEN subject='物理' THEN score ELSE 0 END),
语文=MAX(CASE WHEN subject='语文' THEN score ELSE 0 END)
from score
group by name

我自己的应用:

OPS系统中的Form的数据导出:

 Dim strSql As String = "select vOI.IndustryID,vOI.FairID,vOI.EventID,vOI.OperationID,vOI.ExhibitionName,vOI.Country,vOI.ContactPerson,vOI.Fax"
        For Each value As String In pFormName
            strSql = strSql + ", (case when  sum(case FormName when '" & value & "' then CheckboxPosition end) >0 then 'X' else '' end) [" & value & "]"
        Next
        strSql = strSql + "from vOperationInfo vOI left JOIN  OperationForm OFN  ON  OFN.IndustryID = vOI.IndustryID and OFN.FairID = vOI.FairID and OFN.EventID = vOI.EventID and OFN.OperationID = vOI.OperationID group by vOI.IndustryID,vOI.FairID,vOI.EventID,vOI.OperationID,vOI.Country,vOI.ExhibitionName,vOI.ContactPerson,vOI.Fax"
        BuildSql = strSql

标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}