2017-05-15 7 views
0

Zum ersten Mal lange Zeit anonymer Benutzer.Geschachtelte SQL-Anweisung, die zu unerwarteten Ergebnissen führt

Ich versuche, Registrierungsinformationen basierend auf der Ebene Menschen gehören zu ziehen. Leute in Level 00 könnten in eine von zwei Registrierungen passen, also versuche ich eine verschachtelte Case-Anweisung zu machen. Da die Aussage steht, habe ich ziemlich viele Leute, die in beiden Ergebnissen der verschachtelten Fallaussage auftauchen. Alle anderen Ebenen funktionieren gut. Hat jemand irgendwelche Ideen, warum ein Ergebnis sowohl in der When und Else-Anweisung angezeigt wird, oder gibt es eine geeignetere Möglichkeit, dies anstelle von verschachtelten CASE-Anweisungen zu programmieren?

CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN C.SCREEN = '100' and C.FIELD_NUMBER = '65' and C.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
END AS Registration, 

Aktuelle Ergebnisse für eine Person mit einem Niveau von 00, die die Kriterien des mit dem Schirm trifft = 100, field_number = 65 und Feld _Value = Y in Duplikaten wie führen würde:

  • Person X Location1: Ebene 1: H
  • Person X Location1: Ebene 1: A

Wenn Person X erfüllt, dass die Kriterien, dann sollten sie das zweite Ergebnis haben nicht zeigt, oder zumindest, dass die Ergebnis, das ich anstrebe.

+0

In Bezug auf die Join, zieht es einen Wert zurück pro "Person"? – JohnHC

+5

Bearbeiten Sie Ihre Frage und liefern Sie Beispieldaten und gewünschte Ergebnisse. In einem "case" -Ausdruck wird genau eine "then" -Klausel zurückgegeben. –

Antwort

0

Es ist nichts falsch mit der case, das Problem ist mit Ihrer join. Es ist, zu Recht oder zu Unrecht, mehr als eine Menge von Werten pro Person zu wiederholen.

Wenn Sie die Wirksamkeit Ihrer case Ausdruck über eine große Anzahl von Beispielen testen möchten, können Sie die unten probieren:

-- Set up some test data: 
declare @t table ([Level] nvarchar(10),Screen nvarchar(10), Field_Number nvarchar(10), Field_Value nvarchar(10), [Location] nvarchar(10)); 
insert into @t values('00','100','65','Y','Location1'); 

-- Generate 10 rows of the same values: 
with t as 
(
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t union all 
    select * from @t 
), tt as 
( -- And then join them together 6 times to get 1 million rows (10^6): 
    select t1.* from t t1, t t2, t t3, t t4, t t5, t t6 
) 
select CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
     END AS Registration 
    ,count(*) as c 
from tt b 
group by CASE 
     WHEN B.Level = '00' 
     THEN  
       CASE 
        WHEN b.SCREEN = '100' and b.FIELD_NUMBER = '65' and b.FIELD_VALUE = 'Y' THEN CONCAT(B.Location, ':', B.Level, ':', 'H') 
        ELSE CONCAT(B.Location, ':', B.Level, ':','A') 
       END 
      WHEN B.Level in ('A', 'B', 'C', 'D', 'E') THEN CONCAT(B.Location, ':', 'A-E') 
      WHEN B.Level in ('F', 'G', 'H') THEN CONCAT(B.Location, ':', 'F-H') 
      WHEN B.Level = 'I' THEN CONCAT(B.Location, ':', 'I') 
      WHEN B.Level = 'J' THEN CONCAT(B.Location, ':', 'J') 
      WHEN B.Level = 'K' THEN CONCAT(B.Location, ':', 'K') 
      ELSE CONCAT(':', B.Location, B.Level) 
    END 

Der Ausgang dieser Aussage ist 1 Million Registration Werte, die genau die gleichen sind : . Wenn Sie wirklich wollten, könnte dieses Skript so viele Werte zurückgeben, wie Sie möchten, und Ihre Registration wird sich nicht ändern.


Um dies zu beheben, gehen Sie nur ein select auf die join zwischen B und C Tabellen (ich hoffe, diese deskriptiv alias sind und nicht nur A, B, C, D etc?), Für Person X gefiltert und sieht was zurückgegeben wird. Ich bin 100% zuversichtlich, dass Sie Kombinationen von Daten sehen werden, die unterschiedlich sind.

+0

Das macht Sinn. Ich war zu sehr auf den Fall konzentriert und dachte nicht einmal über den Beitritt nach. Danke für Ihre Hilfe. – Seth

+0

Das war die Antwort, die ich brauchte, also habe ich es so markiert. Da ich neu bin, erhöht sich der Zähler nicht. Danke noch einmal. – Seth

Verwandte Themen