Frage

Ich verwende SQLite in einer Anwendung, die ich entwickle.
Ich versuche, eine ziemlich komplexe Abfrage auszuführen (für mich komplex!), Und ich habe die grundlegenden Ergebnisse brauche ich bekommen, aber ich bin auf immer über die letzte Hürde stecken.

Ich habe diese Abfrage derzeit das tut, was ich brauche es zu tun ...

SELECT SUM(activity)
FROM activities
WHERE activity_id IN(SELECT name_id FROM foods GROUP BY name_id HAVING SUM(points) > 20);  

Ich brauche einen anderen Teil auf diese Abfrage hinzuzufügen, aber das ist, wo es ein wenig kompliziert für mich bekommen hat. Es gibt drei Tabellen .... Daten, Lebensmittel, Aktivitäten und ich brauche die Summe einer Ergebnismenge zu finden, die zwischen zwei Werten aus zwei verschiedenen Tabellen, solange die Mindestanzahl enthält als eine bestimmte Aussage wahr ist.

Im Grunde genommen ..

SELECT SUM(total) FROM (SELECT MIN(value from table1 which is determined by a value in table2, value from table3) AS total
FROM table3
WHERE value from table3 is contained in a result set from table1);

Die folgende Abfrage ist etwas, was ich mit, dass kam funktionieren würde, wenn es keine Syntax überhaupt war (lol!). Das funktioniert nicht, aber ich wollte es nur zeigen, um besser zu verstehen, was ich versuche zu tun.

SELECT SUM(activity_amount) FROM (SELECT min((SELECT SUM(points) - 20 FROM foods WHERE name_id IN(SELECT pk FROM dates WHERE weekly=1) GROUP BY name_id), activity) AS activity_amount
FROM activities
WHERE activity_id IN(SELECT name_id FROM foods GROUP BY name_id HAVING SUM(points) > 20));

Das Problem ist, mit dem ersten Wert in den MIN() ....

SELECT SUM(points) - 20 FROM food WHERE name_id IN(SELECT pk FROM dates WHERE weekly=1) GROUP BY name_id

Diese Aussage ergibt mehr als ein Wert, aber auch wenn ich diese Werte tun müssen gegen andere in der MIN() zu vergleichen, ich brauche sie nur einer nach dem anderen ... nicht als ganzen Satz.

Wie kann ich so etwas wie die obige Abfrage erhalte ich zur Arbeit geschaffen?

EDIT ... einige Beispieltabellen besser helfen. Dank jellomonkey und hainstech

Table#1(dates)  

CREATE TABLE dates (pk INTEGER PRIMARY KEY, date INTEGER, weekly INTEGER)
pk  date       weekly
1   05062009    1  
2   05072009    1  
3   05082009    2 

Table #2(foods)  

CREATE TABLE foods (pk INTEGER PRIMARY KEY, food VARCHAR(64), points DOUBLE, name_id INTEGER)
pk   food   points   name_id  
 1   food1    12.0     1  
 2   food2    9.0      1  
 3   food3    5.0      1  
 4   food4    15.0     2
 5   food5    14.0     2  
 6   food6    12.0     3  

Table#3(activities)  

CREATE TABLE activities (pk INTEGER PRIMARY KEY, activity DOUBLE, activity_id INTEGER)
pk   activity   activity_id
 1     5.0           1  
 2     4.0           1  
 3     2.0           2  
 4     4.0           3  

Mit dieser ex und Abfrage von meiner ursprünglichen Post (eine, die nicht funktioniert), würde ich für eine Ergebnismenge suchen, die eine value..8.0

MIN (26,0-20, 9,0) = 6,0
MIN (29,0-20, 2,0) = 2,0
6,0 + 2,0 = 8,0

Ich hoffe, das hilft!

War es hilfreich?

Lösung

Nach viel Kopf-Kratzen und Wünschelrute Ich vermute, was Sie vielleicht sein wollen:

SELECT SUM(MIN(fp-20, ap)) FROM
  (SELECT dates.pk AS fd, SUM(points) AS fp
  FROM dates
  JOIN foods ON name_id = fd
  GROUP BY fd
  HAVING fp >= 20)
    JOIN
  (SELECT dates.pk AS ad, SUM(activity) AS ap
  FROM dates
  JOIN activities ON activity_id = ad
  GROUP BY ad)
    ON fd = ad

Die Spaltennamen erscheinen Null Verbindung zu ihrer Bedeutung haben, aber, hey, zumindest dieser 8.0 nicht geben und die Subselects geben die anderen Zahlen, die Sie erwähnen! -)

Andere Tipps

Vereinbaren Sie mit jellomonkey - Ich kann nicht genau verstehen, was Sie wollen, wenn Sie weitere Informationen anzeigen. Einfache Tabellendefinitionen, ein paar Zeilen von Beispieldaten und erwartete Ausgabe helfen würden.

Hier ist ein einfaches Beispiel einen Minimalwertes aus einer Tabelle für das Erhalten basierend auf einem Bereich, deren Grenzen in zwei anderen Tabellen definiert:

create table t1(t1id int primary key, value int)
create table t2(t1id int, t2id int primary key, value int)
create table t3(t2id int, t3id int primary key, value int)

select
    MIN(t1.value)
from table1 as t1 
    join table2 as t2 on t2.t1id = t1.t1id
    join table3 as t3 on t3.t2id = t2.t2id
where t1.value between t2.value and t3.value

Dies verwendet t2.value und t3.value als die Grenzen des Bereichs die MIN zu finden () in.

EDIT - Danke für die Beispieltabellen veröffentlichen, dass eine Tonne hilft. Sie könnten einige gewundene CASE-Anweisungen verwenden, um die beiden Werte zu vergleichen, aber ich würde mit ihnen in einem Rowset zu bringen und eine normale MIN Aggregation zu tun. Dies wird besser lesbar und ermöglicht auch Sie leicht einen zusätzlichen Satz von Informationen hinzufügen, in Ihren MIN Eingängen aufzunehmen, wenn nötig. Also hier ist ein kurzer Schlag auf das, was ich tun würde:

select
    SUM(activity)
from (
    select
        min(activity) as activity
        ,activity_id
    from (
        select
            SUM(activity) as activity, activity_id
        from activities 
        group by activity_id
        union all
        select
            SUM(points)-20
            ,name_id
        from foods 
        group by name_id
        having SUM(points) > 20
    ) as activitySum
    where activity_id in (select pk from dates where weekly=1)
    group by activity_id
) as activityLesserOf

Bearbeiten # 2 - hinzugefügt, um obige Abfrage MIT pro die Bedürfnisse Klärung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top