SQL - 过滤重复项

时间:2014-02-19 03:52:52

标签: sql-server-2008

我有一个SQL查询工作正常,但无法生成准确的结果

我的查询详情如下:

declare @test varchar(500)
 SELECT @test=coalesce(@test+',','') + cast(RoleName as varchar) FROM                                                               
        (   select roles.RoleName  from LU_BCOMS_usersroles usrroles
            inner join LU_BCOMS_roles roles 
            on roles.roleid     =   usrroles.Roles_roleid 
            where Users_Userid='MV10310'
        ) as Tbl 

select repfamily.ProductName as Category,repfamily.Family as SeqChange,repfamily.RepFamily as DescOfChange, req.*,
 TaskCompVer =
 CASE WHEN req.UpdateByASPM is not null THEN  'Provide PLQM Wish List'
        WHEN req.UpdateByASPM  is null THEN 'Provide ASPM Wish List'
        WHEN req.CreatedBy is not null THEN  'Provide ASPM Wish List'
        END
  from performa.TX_BCOMS_Request as req   

        inner join TX_BCOMS_Requestrepfamily family on 
        family.request_requestid=req.requestid
        inner  join LU_BCOMS_RepFamily as repfamily on 
        family.RepFamily_repFamilyid=repfamily.repfamilyid         

  where req.UpdatedByPLQM is null  and (

   ((CHARINDEX('ASPM',@test)> 0 and CHARINDEX('PLQM',@test)> 0)  and  req.UpdatedByPLQM IS null)
   or 
   ((CHARINDEX('PLQM' ,@test)> 0)  and req.UpdateByASPM IS NOT null)
   or 
   ((CHARINDEX('ASPM',@test)> 0 )  and  req.UpdateByASPM IS null)
   or 
   ((CHARINDEX('PLQM' ,@test)> 0)  and req.UpdateByASPM IS NOT null)
   or 
   ((CHARINDEX('ASPM' ,@test)< 0 and CHARINDEX('PLQM',@test) < 0)  and req.CreatedBy IS null)
   )

输出:

Caterogy  SeqCategory   DescofChange    RequestId     TaskCompVer

BIGBEAR    BIGBEAR  BIGBEAR     B14020002    Provide ASPM Wish List
ARCUS3PL   KOJN-RE  ARCUS3PL        B14020002    Provide ASPM Wish List
AURORA     Aurora   Aurora          B14020003    Provide ASPM Wish List

当requestId和TaskCompVer相同时,不需要显示2条记录,必须过滤类似下面的内容。

我需要输出如下:

Output : 

    Caterogy            SeqCategory        DescofChange    RequestId TaskCompVer

    BIGBEAR,ARCUS3PL   BIGBEAR,KOJN-RE  BIGBEAR,ARCUS3PL   B14020002 Provide ASPM Wish List
    AURORA             Aurora            Aurora            B14020003 Provide ASPM Wish List

我需要显示实际如上所述我尝试使用STUFF功能无法生成实际输出...

3 个答案:

答案 0 :(得分:1)

愿它对你有所帮助。

CREATE TABLE tempTable(name VARCHAR(50),subjects VARCHAR(50),phone VARCHAR(50))

INSERT INTO tempTable VALUES
('siddique','CRM','123456'),('siddique','Asp.net','9874563'),
('siddique','sql server','44451685'),('Danish','MVC','123456'),
('Danish','sql server','9874563'),('Danish','WCF','44451685'),
('shah g','Account','123456'),('shah g','MBA','9874563'),
('shah g','Math','44451685')

您的简单查询选择所有数据

SELECT * FROM tempTable 

name        subjects      phone
siddique    CRM           123456
siddique    Asp.net       9874563
siddique    sql server    44451685
Danish      MVC           123456
Danish      sql server    9874563
Danish      WCF           44451685
shah g      Account       123456
shah g      MBA           9874563
shah g      Math          44451685

使用 STUFF 以逗号分隔您的值,每个名称(GROUP BY名称)

SELECT 
name
,STUFF((SELECT ', ' + subjects 
FROM tempTable temp2 WHERE temp2.name=temp1.name              
FOR XML PATH('')), 1, 1, '') AS subjects

,STUFF((SELECT '; ' + phone 
FROM tempTable temp2 WHERE temp2.name=temp1.name              
FOR XML PATH('')), 1, 1, '') AS phones

FROM tempTable temp1
GROUP BY name

DROP TABLE tempTable

输出:

name       subjects                  phones
Danish     MVC, sql server, WCF      123456; 9874563; 44451685
shah g     Account, MBA, Math        123456; 9874563; 44451685
siddique   CRM, Asp.net, sql server  123456; 9874563; 44451685

答案 1 :(得分:0)

我需要一个类似的查询,我需要它以同样的方式...这是我的查询:

SELECT  
'All Users' as QuestionOption,
Stuff( (SELECT N'; ' + email FROM users where email>='  ' FOR XML PATH(''),TYPE) 
.value('text()[1]','nvarchar(max)'),1,2,N'') as QuestionOptionValue
UNION
SELECT  'All Volunteers' as QuestionOption, Stuff( (SELECT N'; ' + U.email FROM 
dbo.Users  AS U LEFT OUTER JOIN (SELECT up.UserID, MAX(CASE WHEN ppd.PropertyName = \
'Volunteer' THEN up.PropertyValue ELSE '' END) AS Volunteer
FROM 
dbo.UserProfile AS up 
INNER JOIN dbo.ProfilePropertyDefinition AS ppd ON 
up.PropertyDefinitionID = ppd.PropertyDefinitionID and ppd.PortalID = 0 Group By 
up.UserID) as upd on U.UserID = upd.UserID Where upd.Volunteer='True'  FOR XML 
PATH(''),TYPE)  .value('text()[1]','nvarchar(max)'),1,2,N'') as QuestionOptionValue 
UNION
SELECT  'All Committees' as QuestionOption, Stuff( (SELECT N'; ' + U.email FROM 
dbo.USERS AS U LEFT OUTER JOIN (SELECT up.UserID, MAX(CASE WHEN ppd.PropertyName = 
'Committee' THEN up.PropertyValue ELSE '' END) AS Committee FROM dbo.UserProfile AS 
up INNER JOIN dbo.ProfilePropertyDefinition AS ppd ON up.PropertyDefinitionID = 
ppd.PropertyDefinitionID and ppd.PortalID = 0 Group By up.UserID) as upd on U.UserID 
= upd.UserID Where upd.Committee >' '  FOR XML PATH(''),TYPE) .value('text()
[1]','nvarchar(max)'),1,2,N'') as QuestionOptionValue

我不是最好的写作,所以你可以用我的例子。我的输出是:

QuestionOption                      QuestionOptionValue

All Committees                       Email@email.com; email@email.com
All Users                            Email@email.com; email@email.com
All Volunteers                       Email@email.com; email@email.com

我希望这可以帮到你!

答案 2 :(得分:0)

试试这个,,,,

declare @test varchar(500)
 SELECT @test=coalesce(@test+',','') + cast(RoleName as varchar) FROM                                                               
        (   select roles.RoleName  from LU_BCOMS_usersroles usrroles
            inner join LU_BCOMS_roles roles 
            on roles.roleid     =   usrroles.Roles_roleid 
            where Users_Userid='MV10310'
        ) as Tbl 

select
       req.*,
 TaskCompVer =
 CASE WHEN req.UpdateByASPM is not null THEN  'Provide PLQM Wish List'
        WHEN req.UpdateByASPM  is null THEN 'Provide ASPM Wish List'
        WHEN req.CreatedBy is not null THEN  'Provide ASPM Wish List'
        END,
       STUFF(
             ( 
                select ','+repfamily.ProductName 
                from TX_BCOMS_Requestrepfamily  family              
                    inner  join LU_BCOMS_RepFamily as repfamily     on family.RepFamily_repFamilyid=repfamily.repfamilyid                   
                where family.request_requestid=req.requestid

                FOR XML PATH('') ), 1, 1, '' ) as 'Category',
       STUFF(
             ( 
                select ','+repfamily.Family 
                from TX_BCOMS_Requestrepfamily  family              
                    inner  join LU_BCOMS_RepFamily as repfamily     on family.RepFamily_repFamilyid=repfamily.repfamilyid                   
                where family.request_requestid=req.requestid

                FOR XML PATH('') ), 1, 1, '' ) as 'SeqChange',
       STUFF(
             ( 
                select ','+repfamily.RepFamily 
                from TX_BCOMS_Requestrepfamily  family              
                    inner  join LU_BCOMS_RepFamily as repfamily     on family.RepFamily_repFamilyid=repfamily.repfamilyid                   
                where family.request_requestid=req.requestid

                FOR XML PATH('') ), 1, 1, '' ) as 'DescOfChange' ,

 repfamily.ProductName as Category,repfamily.Family as SeqChange,repfamily.RepFamily as DescOfChange,
  from performa.TX_BCOMS_Request as req         

  where req.UpdatedByPLQM is null  and (

   ((CHARINDEX('ASPM',@test)> 0 and CHARINDEX('PLQM',@test)> 0)  and  req.UpdatedByPLQM IS null)
   or 
   ((CHARINDEX('PLQM' ,@test)> 0)  and req.UpdateByASPM IS NOT null)
   or 
   ((CHARINDEX('ASPM',@test)> 0 )  and  req.UpdateByASPM IS null)
   or 
   ((CHARINDEX('PLQM' ,@test)> 0)  and req.UpdateByASPM IS NOT null)
   or 
   ((CHARINDEX('ASPM' ,@test)< 0 and CHARINDEX('PLQM',@test) < 0)  and req.CreatedBy IS null)
   )