2013-10-11 43 views
0
SELECT 
     ROW_NUMBER() OVER (PARTITION BY s.ExitStateTypeId ORDER BY s.InsertDate) AS Number 
     ,x.Id 
     ,p.FirstName 
     ,p.LastName 
     ,p.PN 
     ,t.Name 
     ,s.ExitStateTypeId as [Status] 
     ,g.Name 
     ,x.OrganisationId 
     ,d.Name AS Direction 
     ,d.Id AS DirectionId 
     ,h.Name AS Referal 
     ,h.Id AS HealthOrgTypeId 
     ,s.IssueDate 
     ,s.InsertDate 
    FROM [DB1].[dbo].[Exits] x 
    INNER JOIN [DB1].[dbo].[ExitStates] s on x.Id = s.ExitId 
    INNER JOIN [DB1].[dbo].[HealthOrgTypes] h on x.HealthOrgTypeId = h.Id 
    INNER JOIN [DB1].[dbo].[Directions] d on x.DirectionId = d.Id 
    INNER JOIN [DB1].[dbo].[HealthCards] c on x.HealthCardId = c.Id 
    INNER JOIN [DB2].[pr].[TABLE] p on p.Id = c.TABLEId 
    INNER JOIN [DB3].[orgs].[Organizations] g on g.Id = x.OrganisationId 
    INNER JOIN [DB4].[dbo].ExitStateTypes t on t.Id = s.ExitStateTypeId 
    WHERE s.Id = (SELECT MAX(es.Id) from ExitStates es WHERE es.ExitId=x.Id) 
    ORDER BY s.InsertDate 

这是我的查询,但我需要的是,我想只有那些行通过ROW_NUMBERs.ExitStateTypeId是(4,7),对其他行应该是枚举为-1。ROW_NUMBER()对某些值的行

这是错误的查询只是为了得到这个想法。

SELECT 
    ROW_NUMBER() OVER (PARTITION BY s.ExitStateTypeId Where s.ExitStateTypeId IN (4,7) 
         ORDER BY s.InsertDate) AS Number 
     ,x.Id 
     ,p.FirstName 
     ,p.LastName 
     ,p.PN 
     ,t.Name 
     ,s.ExitStateTypeId as [Status] 
     ,g.Name 
     ,x.OrganisationId 
     ,d.Name AS Direction 
     ,d.Id AS DirectionId 
     ,h.Name AS Referal 
     ,h.Id AS HealthOrgTypeId 
     ,s.IssueDate 
     ,s.InsertDate 
    FROM [DB1].[dbo].[Exits] x 
    INNER JOIN [DB1].[dbo].[ExitStates] s on x.Id = s.ExitId 
    INNER JOIN [DB1].[dbo].[HealthOrgTypes] h on x.HealthOrgTypeId = h.Id 
    INNER JOIN [DB1].[dbo].[Directions] d on x.DirectionId = d.Id 
    INNER JOIN [DB1].[dbo].[HealthCards] c on x.HealthCardId = c.Id 
    INNER JOIN [DB2].[pr].[TABLE] p on p.Id = c.TABLEId 
    INNER JOIN [DB3].[orgs].[Organizations] g on g.Id = x.OrganisationId 
    INNER JOIN [DB4].[dbo].ExitStateTypes t on t.Id = s.ExitStateTypeId 
WHERE s.Id = (SELECT MAX(es.Id) from ExitStates es WHERE es.ExitId=x.Id) 
ORDER BY s.InsertDate 

所以,我想通过分区只是s.ExitStateTypeId当它是为别人

4,7和-1这是数据我希望

enter image description here

+0

为什么这是用jQuery标记的吗? –

+0

jquery ???????????? -不是。))) – levi

回答

1

也许与组合CASEROW_NUMBER

SELECT Number = CASE WHEN s.ExitStateTypeId NOT IN (4,7) THEN -1 
     ELSE Row_number() OVER ( 
      partition BY s.exitstatetypeid 
      ORDER BY s.insertdate) END, 
     x.id, 
     p.firstname, 
     p.lastname, 
     p.pn, 
     t.name, 
     s.exitstatetypeid   AS [Status], 
     g.name, 
     x.organisationid, 
     d.name      AS Direction, 
     d.id      AS DirectionId, 
     h.name      AS Referal, 
     h.id      AS HealthOrgTypeId, 
     s.issuedate, 
     s.insertdate 
FROM [DB1].[dbo].[exits] x 
     INNER JOIN [DB1].[dbo].[exitstates] s 
       ON x.id = s.exitid 
     INNER JOIN [DB1].[dbo].[healthorgtypes] h 
       ON x.healthorgtypeid = h.id 
     INNER JOIN [DB1].[dbo].[directions] d 
       ON x.directionid = d.id 
     INNER JOIN [DB1].[dbo].[healthcards] c 
       ON x.healthcardid = c.id 
     INNER JOIN [DB2].[pr].[table] p 
       ON p.id = c.tableid 
     INNER JOIN [DB3].[orgs].[organizations] g 
       ON g.id = x.organisationid 
     INNER JOIN [DB4].[dbo].exitstatetypes t 
       ON t.id = s.exitstatetypeid 
WHERE s.id = (SELECT Max(es.id) 
       FROM exitstates es 
       WHERE es.exitid = x.id) 
ORDER BY s.insertdate 
0

获取行号,左外连接和空行数的值设置为-1(如下图所示,可能必须解决它了一点,因为我没有一个模式一起工作):

;with RowNumber(ExitId, RowNumber) 
as 
(
    SELECT 
     x.Id 
     , ROW_NUMBER() OVER (PARTITION BY s.ExitStateTypeId ORDER BY s.InsertDate)   
     FROM 
     [DB1].[dbo].[Exits] x 
     INNER JOIN [DB1].[dbo].[ExitStates] s 
     on x.Id = s.ExitId 
     WHERE 
     s.Id = (SELECT MAX(es.Id) from ExitStates es WHERE es.ExitId=x.Id) 
     and s.ExitStateTypeId in (4, 7) 
) 

SELECT 
     ISNULL(rn.RowNumber, -1) AS Number 
     ,x.Id 
     ,p.FirstName 
     ,p.LastName 
     ,p.PN 
     ,t.Name 
     ,s.ExitStateTypeId as [Status] 
     ,g.Name 
     ,x.OrganisationId 
     ,d.Name AS Direction 
     ,d.Id AS DirectionId 
     ,h.Name AS Referal 
     ,h.Id AS HealthOrgTypeId 
     ,s.IssueDate 
     ,s.InsertDate 
    FROM [DB1].[dbo].[Exits] x 
    INNER JOIN [DB1].[dbo].[ExitStates] s on x.Id = s.ExitId 
    INNER JOIN [DB1].[dbo].[HealthOrgTypes] h on x.HealthOrgTypeId = h.Id 
    INNER JOIN [DB1].[dbo].[Directions] d on x.DirectionId = d.Id 
    INNER JOIN [DB1].[dbo].[HealthCards] c on x.HealthCardId = c.Id 
    INNER JOIN [DB2].[pr].[TABLE] p on p.Id = c.TABLEId 
    INNER JOIN [DB3].[orgs].[Organizations] g on g.Id = x.OrganisationId 
    INNER JOIN [DB4].[dbo].ExitStateTypes t on t.Id = s.ExitStateTypeId 
    left outer join RowNumber rn 
    on x.Id = rn.ExitId 
    WHERE s.Id = (SELECT MAX(es.Id) from ExitStates es WHERE es.ExitId=x.Id) 
    ORDER BY s.InsertDate