2016-07-30 6 views
2

테이블 스키마목록의 범위 및 총 수는 조건에 따라

CREATE TABLE [dbo].[TblMaster](
    [SID] [int] IDENTITY(1,1) NOT NULL Primary Key, 
    [VID] [int] NOT NULL, 
    [CreatedDate] [datetime] default (getdate()) NOT NULL, 
    [CharToAdd] [varchar](10) NULL, 
    [Start] [int] NOT NULL, 
    [End] [int] NOT NULL 
) 
GO 

CREATE TABLE [dbo].[TblDetails](
    [DetailsID] [int] IDENTITY(1,1) NOT NULL Primary Key, 
    [SID] [int] NOT NULL, 
    [Sno] [int] NOT NULL, 
    [ConcatenatedText] [varchar](20) NOT NULL, 
    [isIssued] [bit] default (0) NOT NULL, 
    [isUsed] [bit] default (0) NOT NULL 
) 
GO 

샘플 데이터 :

Insert into dbo.TblMaster Values (1,default, 'CA', 1, 5) 
Insert into dbo.TblMaster Values (1,default, 'PA', 1, 5) 
GO 
Insert into dbo.TblDetails values(1, 1, 'CA1', 0,0) 
Insert into dbo.TblDetails values(1, 2, 'CA2', 0,0) 
Insert into dbo.TblDetails values(1, 3, 'CA3', 0,0) 
Insert into dbo.TblDetails values(1, 4, 'CA4', 1,0) 
Insert into dbo.TblDetails values(1, 5, 'CA5', 0,0) 
Insert into dbo.TblDetails values(2, 1, 'PA1', 0,0) 
Insert into dbo.TblDetails values(2, 2, 'PA2', 0,0) 
Insert into dbo.TblDetails values(2, 3, 'PA3', 1,0) 
Insert into dbo.TblDetails values(2, 4, 'PA4', 0,0) 
Insert into dbo.TblDetails values(2, 5, 'PA5', 0,0) 
Insert into dbo.TblDetails values(3, 1, '1', 0,0) 
Insert into dbo.TblDetails values(3, 2, '2', 1,0) 
Insert into dbo.TblDetails values(3, 3, '3', 1,0) 
Insert into dbo.TblDetails values(3, 4, '4', 0,0) 
Insert into dbo.TblDetails values(3, 5, '5', 0,0) 
    GO 

예상 출력 :

enter image description here

012 3,516,

쿼리는 나는 지금으로 구축 : 비트 열을 1 인 경우 TblDetails 테이블에서

Declare @VID INT = 1 

    ;WITH Tmp as 
    (
     SELECT 
      TM.CharToAdd as Prefix, 
      sno, 
      sno - ROW_NUMBER() OVER(ORDER BY sno) as grp 
     FROM dbo.TblDetails TD 
     LEFT JOIN dbo.TblMaster TM on TM.[SID] = TD.[SID]    
     WHERE isIssued = 0 and isUsed = 0 
      AND TM.VID = @VID 
    ) 
    SELECT Prefix, 
      MIN(sno) as RangeStart, 
      MAX(sno) as RangeEnd, 
      COUNT(*) as [Count] 
    FROM Tmp 
    GROUP BY grp, Prefix 

누구의 비트 열을 0으로 모든 기록에서 사용 가능한 값과 총 카운트의 범위를 찾으려면 이미 사용 중이므로 건너 뛰고 사용 가능한 레코드로 나머지를 나열하려고합니다. 문제 성명서를 잘 설명하는지 여부는 의심스러운 것이므로 샘플 데이터와 더 나은 이해를위한 예상 결과를 제공했습니다. 몇 가지 재귀 함수를 시도했지만 결과가 예상 출력과 일치하지 않습니다. 이렇게 이것을 해결하는 도움을 찾고. 당신은 매우 가까웠다

답변

0

...

CODE

Declare @VID INT = 1 

;with cte as(
    select 
     m.CHarToAdd, 
     d.sno, 
     d.sno - ROW_NUMBER() OVER(partition by m.CharToAdd ORDER BY sno) as grp 
    from 
     TblMaster m 
     inner join 
      TblDetails d on 
      d.sid = m.sid 
    where 
     d.isIssued = 0 and d.isUsed = 0 and m.vid = @VID) 

select 
    CharToAdd, 
    min(sno) as Start, 
    max(sno) as [End], 
    (max(sno) - min(sno) + 1) as [Count] 
from cte 
group by 
    CHarToAdd, grp 
order by 
    CHarToAdd 

당신의 시간에 대한

CharToAdd Start End Count 
CA    1 3 3 
CA    5 5 1 
PA    1 2 2 
PA    4 5 2 
+0

감사 결과. – prasanth

+0

@ prasanth 문제 없음 – scsimon

관련 문제