2016-07-16 15 views
0

Summe nicht ich folgendes Problem: Ich habe eine Tabelle, in der es die folgenden Werte:SQL nur Zeilen mit Zahlen verlassen, die auf Null

  • ID: VALUE
  • 1: 900
  • 2: -900
  • 3: 900
  • 4: 900

ich möchte eine Anfrage stellen, dass ‚ca ncels' die Zeilen, die auf Null, hier beispielsweise 1 und 2 oder 2 und 3 oder 2 und 4 so am Ende hinzufügen kann ich die folgende Tabelle von Werten hat

aber nicht die Summe von ihnen (1800) Ich will sie separat, ist mir egal, welche ID es wählt nur die Zahlen, die nicht zu Null hinzufügen, danke!


Hallo an alle Dank für die Hilfe, ja in der Tat würde ich gerne sehen, wenn es eine Lösung in einfachen Grunde SQL ist (klin Antwort ist ausgezeichnet, aber sieht aus wie eine Postgres benutzerdefinierte Funktion UNNEST hat), so dass ist warum ich das in Access versucht habe, der Grund ist, dass eines Tages bei der Arbeit jemand mit diesem Problem zu mir kam (ein Finanzmann, weißt du, sie haben die seltsamsten Anforderungen) und ich habe einen Weg gefunden, dies zu tun Excel und VBA, aber ich frage mich, ob es eine Möglichkeit gibt, dies direkt auf SQL zu tun, danke nochmal! und für melpomenes Kommentar, nein, 400.500 und -900 sollten nicht abbrechen, nur Paare mit gleichem Wert, umgekehrtes Vorzeichen, danke.

+3

Dies scheint nicht die Art von Ding, für die eine Datenbank entworfen ist, und es scheint auch nicht wie eine praktische Möglichkeit zum Speichern von Daten. Vielleicht möchten Sie erklären, WARUM Sie das brauchen, damit wir Sie in die richtige Richtung weisen können. – Erik

+1

Ich entfernte die überflüssigen Datenbank-Tags. Bitte markieren Sie das Problem mit der Datenbank, die Sie tatsächlich verwenden. –

+1

Was ist, wenn die Werte '400',' 500' und '-900' sind? Sollte das aussetzen? – melpomene

Antwort

0

Ich nehme an, dass wir nach Paaren von Zeilen mit entgegengesetzten Werten suchen.

Beispieldaten (Postgres).

create table test (id int, val int); 
insert into test values 
    (1, 900), (2, -900), (3, 900), (4, 900), 
    (5, -400), (6, 400), (7, -400), (8, -400); 

select * from test; 

id | val 
----+------ 
    1 | 900 
    2 | -900 
    3 | 900 
    4 | 900 
    5 | -400 
    6 | 400 
    7 | -400 
    8 | -400 
(8 rows) 

Abfrage:

delete from test 
where id in (
    select unnest(array[id1, id2]) 
    from (
     select distinct on (id1) * 
     from ( 
      select t1.id id1, t2.id id2 
      from test t1 
      join test t2 
      on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0 
      ) s1 
     ) s2 
); 

Ergebnis:

select * from test; 

id | val 
----+------ 
    3 | 900 
    4 | 900 
    5 | -400 
    8 | -400 
(4 rows) 

Sie die Abfrage ohne spezifische Postgres Funktionalitäten ausprobieren können:

delete from test 
where id in (
    select id1 
    from (
     select id1, min(id2) id2 
     from (
      select t1.id id1, t2.id id2 
      from test t1 
      join test t2 
      on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0 
      ) s1 
     group by id1 
     ) s2 
    union all 
    select id2 
    from (
     select id1, min(id2) id2 
     from (
      select t1.id id1, t2.id id2 
      from test t1 
      join test t2 
      on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0 
      ) s1 
     group by id1 
     ) s3 
); 

Verwenden Sie einen allgemeinen Tabellenausdruck (with-Anweisung) für die Unterabfrage, wenn Ihr Server dies akzeptieren kann.