none
多个数据行,其中某一列的数据能否作为一列显示? RRS feed

  • 问题

  • 上为我sql语句

    目前的结果。其实我就想让“险种”那列作为这条数据的一行显示,例如:

    序号      busid             drivername                insurlistnum                                    险种

    1       吉A30241               高明                        picc12345           死亡伤残赔偿,医疗费用赔偿,财产损失赔偿

    是否有解?

    2012年2月18日 6:15

答案

  • 小弟了解您的意思了,請加入WHERE條件就好了哦!  WHERE A.busid = B.busid

    DECLARE @T1 AS TABLE (
    busid NVARCHAR(20)
    , drivername NVARCHAR(20)
    , insurlistnum NVARCHAR(10)
    , insurchildname NVARCHAR(10)
    );
    
    INSERT INTO @T1
            ( busid ,
              drivername ,
              insurlistnum ,
              insurchildname
            )
    VALUES  ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'死亡伤残赔偿'  
            )
            ,
            ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'医疗费用赔偿'  
            )
            ,( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'财产损失赔偿'  
            )
    		,( N'吉A99988' ,  
              N'高99988' ,  
              N'PICC99988' ,  
              N'财产损失赔偿'  
            );
    SELECT ', ' + insurchildname from @T1 WHERE busid = N'吉A99988' FOR XML PATH('') ;
    
    SELECT DISTINCT A.busid ,
    A.drivername ,
    A.insurlistnum ,
    STUFF( (SELECT ', ' + insurchildname from @T1 B WHERE A.busid = B.busid FOR XML PATH('')), 1, 1, '') AS  [险种] FROM  @T1 A;



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月1日 7:40

全部回复

  • 您好,请参考以下的资讯,Combine Multiple Rows into One Row using SQL Server

    主要是靠:

    SELECT ', ' + insurchildname from @T1 FOR XML PATH('')
    DECLARE @T1 AS TABLE (
    busid NVARCHAR(20)
    , drivername NVARCHAR(20)
    , insurlistnum NVARCHAR(10)
    , insurchildname NVARCHAR(10)
    );
    
    INSERT INTO @T1
            ( busid ,
              drivername ,
              insurlistnum ,
              insurchildname
            )
    VALUES  ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'死亡伤残赔偿'  
            )
            ,
            ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'医疗费用赔偿'  
            )
            ,( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'财产损失赔偿'  
            );
            
    SELECT DISTINCT busid ,
    drivername ,
    insurlistnum ,
    STUFF( (SELECT ', ' + insurchildname from @T1 FOR XML PATH('')), 1, 1, '') AS  [险种] FROM  @T1;


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月18日 8:35
  • 用这个SELECT ', ' + insurchildname from @T1 FOR XML PATH('')

    语句,虽然样式上实现了。但还是存在问题。我写个复杂的SQL,查询结果虽然都正确返回。但是有些字段的值,确被第一条记录的对应值覆盖了。我现在是做车辆保险信息的。

    一台车,有3种必保的类型:交强险,商业险,承运人险。交强和商业险有对应的险种,交强险固定3个,而商业险因车而异,但是有10个。也就是说一台车,可能对应3个保险公司,3种类型的保单,3个有效期,3~13个险种。我这样设计的表问题么?保期都是1年制。添加信息时候,我想根据截至日期写一个过保提醒日期方法。例如:20120131-20130130。提醒日期提前结束日期一个月,但月份大小,可能跨年,可能不跨年。这个方法没思路。

    我一次对3个表添加记录,而显示只要求显示交强险的信息。

    现在险种和保额和那列,实质被覆盖了。我的SQL

    SELECT A.ID AS SQLID,B.BUSID AS BUSID,D.DRIVERNAME AS DRIVERNAME,A.INSURLISTNUM AS INSURLISTNUM,
    STUFF((select','+A.INSURCHILDNAME from s_pub_InsurChildInfo A LEFT JOIN s_pub_InsurInfoAndChild B ON A.ID=B.CHILDID where INSURINFOID='1001' for XML PATH('')),1,1,'') as '险种',
    (SELECT SUM(CAST(INSURCOST AS FLOAT)) FROM s_pub_InsurInfoAndBus ) AS INSURCOSTSUM,
     (A.STARDATE+'至'+A.ENDDATE) AS '有效期'
    FROM s_pub_InsurInfoAndBus A 
    LEFT JOIN s_pub_InsurAndBus B ON A.BUSINFOMAINID=B.ID
    LEFT JOIN s_pub_InsurChildInfo C ON C.ID=A.TYPEID
    LEFT JOIN S_pub_busdriver d on D.BUSID=B.BUSID
    WHERE TYPEID='1001' 

    2012年2月29日 9:11
  • 您好,目前是,死亡伤残赔偿, 医疗费用赔偿, 财产损失赔偿,您說「现在险种和保额和那列,实质被覆盖了」指的是什么呢?

    請問您是否能给我SQL以便测试呢?
    建立Table & Insert data的Script, Thanks.


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月1日 2:09
  • 我上边的SQL,查保和的,实质不应一样。但都被第一条数据结果覆盖之后的
    2012年3月1日 5:27
  • 小弟了解您的意思了,請加入WHERE條件就好了哦!  WHERE A.busid = B.busid

    DECLARE @T1 AS TABLE (
    busid NVARCHAR(20)
    , drivername NVARCHAR(20)
    , insurlistnum NVARCHAR(10)
    , insurchildname NVARCHAR(10)
    );
    
    INSERT INTO @T1
            ( busid ,
              drivername ,
              insurlistnum ,
              insurchildname
            )
    VALUES  ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'死亡伤残赔偿'  
            )
            ,
            ( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'医疗费用赔偿'  
            )
            ,( N'吉A30241' ,  
              N'高 明' ,  
              N'PICC12345' ,  
              N'财产损失赔偿'  
            )
    		,( N'吉A99988' ,  
              N'高99988' ,  
              N'PICC99988' ,  
              N'财产损失赔偿'  
            );
    SELECT ', ' + insurchildname from @T1 WHERE busid = N'吉A99988' FOR XML PATH('') ;
    
    SELECT DISTINCT A.busid ,
    A.drivername ,
    A.insurlistnum ,
    STUFF( (SELECT ', ' + insurchildname from @T1 B WHERE A.busid = B.busid FOR XML PATH('')), 1, 1, '') AS  [险种] FROM  @T1 A;



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年3月1日 7:40