2016-06-29 3 views
1

Ich habe eine Tabelle @EmplTable, die vier Zeilen hat. Es ist der Name von vier Angestellten. Dann habe ich eine Tabelle @MonitorTable, die die Arbeit dieser Mitarbeiter überwacht.Abrufen, wie viele Gruppen alle Werte der Spalte als null festgelegt haben?

Angenommen, dass nichts am Tisch gelandet ist, werden @MonitorTable 12 Zeilen haben, die den drei Wochen entsprechen, in denen diese vier Mitarbeiter arbeiten werden. Die Spalte ist für alles null, was bedeutet, dass nichts zugewiesen wurde.

des IsProcessed Lassen Sie sagen, auf true gesetzt ist für EmpId 3 von WeekNum 1, wie kann ich, wie viele Gruppen von WeekNum bestimmen haben alle vier Reihen null? In diesem Fall wäre das Ergebnis 2 (3), da WeekNum 1 eine Zeile mit IsProcessed auf true gesetzt hat.

Ich bin das Skript enthalten. Jede Hilfe wird geschätzt.

Danke.

declare @EmplTable table 
(
    EmpId INT IDENTITY NOT NULL PRIMARY KEY, 
    Name varchar(20) 
) 

insert into @EmplTable (Name) select 'John' 
insert into @EmplTable (Name) select 'Mary' 
insert into @EmplTable (Name) select 'Ron' 
insert into @EmplTable (Name) select 'Bob' 

declare @count int 
select @count = count(*) from @EmplTable 

declare @MonitorTable table 
(
    EmpId int, 
    WeekNum int, 
    IsProcessed bit 
) 

insert into @MonitorTable (EmpId, WeekNum) select 1, 1 
insert into @MonitorTable (EmpId, WeekNum) select 2, 1 
insert into @MonitorTable (EmpId, WeekNum) select 3, 1 
insert into @MonitorTable (EmpId, WeekNum) select 4, 1 
insert into @MonitorTable (EmpId, WeekNum) select 1, 2 
insert into @MonitorTable (EmpId, WeekNum) select 2, 2 
insert into @MonitorTable (EmpId, WeekNum) select 3, 2 
insert into @MonitorTable (EmpId, WeekNum) select 4, 2 
insert into @MonitorTable (EmpId, WeekNum) select 1, 3 
insert into @MonitorTable (EmpId, WeekNum) select 2, 3 
insert into @MonitorTable (EmpId, WeekNum) select 3, 3 
insert into @MonitorTable (EmpId, WeekNum) select 4, 3 

update @MonitorTable set IsProcessed = 1 where EmpId = 1 and WeekNum = 1 

SELECT WeekNum 
FROM @MonitorTable 
GROUP BY WeekNum 
HAVING COUNT(CASE WHEN IsProcessed = 1 THEN 0 
        ELSE 1 
       END) = @count 

-- Should return 2, 3 since WeekNum has been updated. It returns 1, 2, 3. 
+0

Monitor-Tabellendaten müssen nicht mit Ihrem isprocessed Bit wird passend, weitere könnten Sie einige Beispiel post-Ergebnisse mit den erwarteten Ausgang – TheGameiswar

+0

Ich bin nicht sicher was du meinst. Aber ich habe eine Änderung an der Abfrage vorgenommen und das Ergebnis, das ich bekommen sollte. – rbhat

+0

@rbhatup ändern 'COUNT (CASE' zu' SUM (CASE' – JamieD77

Antwort

1

dies sollten Sie die 2 Datensätze geben Sie

SELECT WeekNum 
FROM @MonitorTable 
GROUP BY WeekNum 
HAVING SUM(CASE WHEN IsProcessed = 1 THEN 0 
        ELSE 1 
       END) = 4 
+0

Danke, aber aus irgendeinem Grund bekomme ich 'WeekNum' 1, 2, 3 im Ergebnis. Aber ich habe WeekNum 1 aktualisiert, also sollte es nur 2 sein & 3. Ich habe das Skript aktualisiert, um das Ergebnis anzuzeigen: – rbhat

+0

@rbhatup hatte zuerst die Anzahl, wurde aber zu SUM geändert – JamieD77

+0

Ich konnte es mit der Summe anstelle der Zählung arbeiten – rbhat

0
declare @EmplTable table 
(
    EmpId INT IDENTITY NOT NULL PRIMARY KEY, 
    Name varchar(20) 
) 

insert into @EmplTable (Name) select 'John' 
insert into @EmplTable (Name) select 'Mary' 
insert into @EmplTable (Name) select 'Ron' 
insert into @EmplTable (Name) select 'Bob' 

declare @MonitorTable table 
(
    EmpId int, 
    WeekNum int, 
    IsProcessed bit 
) 

insert into @MonitorTable (EmpId, WeekNum) select 1, 1 
insert into @MonitorTable (EmpId, WeekNum) select 2, 1 
insert into @MonitorTable (EmpId, WeekNum, IsProcessed) select 3, 1, 1 
insert into @MonitorTable (EmpId, WeekNum) select 4, 1 
insert into @MonitorTable (EmpId, WeekNum) select 1, 2 
insert into @MonitorTable (EmpId, WeekNum) select 2, 2 
insert into @MonitorTable (EmpId, WeekNum) select 3, 2 
insert into @MonitorTable (EmpId, WeekNum) select 4, 2 
insert into @MonitorTable (EmpId, WeekNum) select 1, 3 
insert into @MonitorTable (EmpId, WeekNum) select 2, 3 
insert into @MonitorTable (EmpId, WeekNum) select 3, 3 
insert into @MonitorTable (EmpId, WeekNum) select 4, 3 

select * from @MonitorTable 

if object_id('tempdb..#temp') is not null drop table #temp 

select WeekNum as ct 
into #temp 
from @MonitorTable 
group by WeekNum 
having sum(cast(isnull(IsProcessed,0) as int)) = 0 


select count(ct) as ct from #temp 
Verwandte Themen