2016-07-30 13 views
2

TabellenschemaListenbereiche und die Gesamtzahl der Grundlage der Bedingung

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 

Beispieldaten:

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 

Erwartete Ausgabe:

enter image description here

Abfrage Ich habe ab jetzt gebaut:

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 

Im TblDetails Tabelle den Bereich der verfügbaren Werte und ihre Gesamtzahl von alle Datensätze, deren Bit-Spalten sind 0. finden wollen Wenn Bit Spalte 1 ist dann es bedeutet, dass es bereits verwendet wird, also versuche ich es zu überspringen und Liste als verfügbare Datensätze aufzulisten. Zweifelnd, ob ich die Problemstellung gut erkläre, also die Beispieldaten und die erwartete Ausgabe zum besseren Verständnis zur Verfügung gestellt habe. Ich habe versucht, einige rekursive Funktion zu tun, aber das Ergebnis stimmt nicht mit der erwarteten Ausgabe überein. Also suche nach Hilfe, um das zu lösen.

Antwort

0

Sie ganz in der Nähe waren ...

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 

ERGEBNISSE

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

Vielen Dank für Ihre Zeit. – prasanth

+0

@ Prasanth kein Problem – scsimon

Verwandte Themen