一般的sql列转化为行,都是用了sum等求和函数。我现在的其中有些是不用求和的。。
我现在机器上没有装mysql。。但是下面的语句在sqlserver2005下能行。。
DYN_VECHILE表
FLIGHT_NO,START_TIME,END_TIME,VECHILE_ID,VECHILE_NUM
1            10:20     10:23     10           2       
1            10:25     10:30     20           3 
1            11:20     11:23     30           0 
1            13:27     13:33     40           5 
1            15:30     15:43     50           8 
2            19:27     19:33     10           6 
2            23:27     23:33     20           2
2            18:27     18:33     30           1SELECT FLIGHT_NO,
(SELECT START_TIME FROM DYN_VECHILE v1 WHERE VECHILE_ID=10 AND v1.FLIGHT_NO = v.FLIGHT_NO) AS '10Begin',
(SELECT END_TIME FROM DYN_VECHILE v2 WHERE VECHILE_ID=10 AND v2.FLIGHT_NO = v.FLIGHT_NO) AS '10END',
(SELECT START_TIME FROM DYN_VECHILE v3 WHERE VECHILE_ID=20 AND v3.FLIGHT_NO = v.FLIGHT_NO) AS '20Begin',
(SELECT END_TIME FROM DYN_VECHILE v4 WHERE VECHILE_ID=20 AND v4.FLIGHT_NO = v.FLIGHT_NO) AS '20END',
SUM(CASE VECHILE_ID WHEN 30 THEN VECHILE_NUM ELSE 0 END) AS '30Times',
SUM(CASE VECHILE_ID WHEN 40 THEN VECHILE_NUM ELSE 0 END) AS '40Times'
FROM
DYN_VECHILE v
GROUP BY
FLIGHT_NO但是用了太多的子查询嵌套了 。。
能不能用什么写法来代替这个功能呢? 
主要是在sqlserver上。。
(SELECT START_TIME FROM DYN_VECHILE v1 WHERE VECHILE_ID=10 AND v1.FLIGHT_NO = v.FLIGHT_NO) AS '10Begin',
这个我觉得有点多余了
我想这种写法不是很好。代码太多了。谢谢谢了 。。

解决方案 »

  1.   

    这里是MYSQL版。MYSQL和MSSQL的语法有一定的差别。你要精简代码,可以用CASE 语句去匹配。
      

  2.   

    select FLIGHT_NO,
    Max(IF(VECHILE_ID=10,START_TIME,null)) as `10Begin`,
    max(if(VECHILE_ID=10,END_TIME,null)) as `10END`,
    max(if(VECHILE_ID=20,START_TIME,null)) as `20Begin`,
    max(if(VECHILE_ID=20,END_TIME,null)) AS `20END`,
    Sum(IF(VECHILE_ID=30,VECHILE_NUM,null)) as `30Times`,
    sum(if(VECHILE_ID=40,VECHILE_NUM,null)) as `40Times`
    from DYN_VECHILE
    group By FLIGHT_NO