2017-02-08 3 views
1

Ich versuche, eine einzige Tabelle aus den Ergebnissen von 9 verschiedenen Unterabfragen zu machen. Hier ist mein Code:Wählen Sie Ergebnisse aus mehreren Unterabfragen

SELECT 

APR16 
FROM(
SELECT Sum(APR.[kwh]) AS APR16 
FROM Peak_Times, Meter_Buckets INNER JOIN APR ON Meter_Buckets.METER = APR.meter 
WHERE (((APR.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND APR.kwh IS NOT NULL) 
, 

MAY16 
FROM(
SELECT Sum(MAY.[kwh]) AS MAY16 
FROM Peak_Times, Meter_Buckets INNER JOIN MAY ON Meter_Buckets.METER = MAY.meter 
WHERE (((MAY.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND MAY.kwh IS NOT NULL) 
, 

JUN16 
FROM(
SELECT Sum(JUN.[kwh]) AS JUN16 
FROM Peak_Times, Meter_Buckets INNER JOIN JUN ON Meter_Buckets.METER = JUN.meter 
WHERE (((JUN.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND JUN.kwh IS NOT NULL) 
, 

JUL16 
FROM(
SELECT Sum(JUL.[kwh]) AS JUL16 
FROM Peak_Times, Meter_Buckets INNER JOIN JUL ON Meter_Buckets.METER = JUL.meter 
WHERE (((JUL.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND JUL.kwh IS NOT NULL) 
, 

AUG16 
FROM(
SELECT Sum(AUG.[kwh]) AS AUG16 
FROM Peak_Times, Meter_Buckets INNER JOIN AUG ON Meter_Buckets.METER = AUG.meter 
WHERE (((AUG.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND AUG.kwh IS NOT NULL) 
, 

SEP16 
FROM(
SELECT Sum(SEP.[kwh]) AS SEP16 
FROM Peak_Times, Meter_Buckets INNER JOIN SEP ON Meter_Buckets.METER = SEP.meter 
WHERE (((SEP.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND SEP.kwh IS NOT NULL) 
, 

OCT16 
FROM(
SELECT Sum(OCT.[kwh]) AS OCT16 
FROM Peak_Times, Meter_Buckets INNER JOIN OCT ON Meter_Buckets.METER = OCT.meter 
WHERE (((OCT.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND OCT.kwh IS NOT NULL) 
, 

NOV16 
FROM(
SELECT Sum(NOV.[kwh]) AS NOV16 
FROM Peak_Times, Meter_Buckets INNER JOIN NOV ON Meter_Buckets.METER = NOV.meter 
WHERE (((NOV.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND NOV.kwh IS NOT NULL) 
, 

DEC16 
FROM(
SELECT Sum(DEC.[kwh]) AS DEC16 
FROM Peak_Times, Meter_Buckets INNER JOIN DEC ON Meter_Buckets.METER = DEC.meter 
WHERE (((DEC.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND DEC.kwh IS NOT NULL) 

Wenn ich nur die erste Unterabfrage tun,

SELECT 

APR16 
FROM(
SELECT Sum(APR.[kwh]) AS APR16 
FROM Peak_Times, Meter_Buckets INNER JOIN APR ON Meter_Buckets.METER = APR.meter 
WHERE (((APR.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND APR.kwh IS NOT NULL); 

es ein Ergebnis ohne Fehler zurückgibt. Wenn ich jedoch versuche, sie alle wie oben beschrieben zu verketten, bekomme ich am 2. FROM einen Syntaxfehler. Ich möchte ein Ergebnis, das in etwa so aussieht:

APR16|MAY16|JUN16 
57212|45681|721 

Kann mir jemand sagen, die richtige Syntax, dies zu tun? Dies kann etwas Einfaches sein, das ich übersehen habe, oder etwas, das ich einfach nicht tun kann. Vielen Dank im Voraus für die Hilfe.

Antwort

0

Sie können die Ergebnisse für mehrere Unterabfragen im Format wie diese Sie suchen erhalten:

select 
    (select count(*) from table1) as result1, 
    (select count(*) from table2) as result2, 
    .. 

auf Ihre Anfrage angewendet wird, würde es in etwa so aussehen:

SELECT 
    (SELECT Sum(APR.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN APR ON Meter_Buckets.METER = APR.meter 
    WHERE (((APR.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND APR.kwh IS NOT NULL) 
    AS APR16 
    , 
    (SELECT Sum(MAY.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN MAY ON Meter_Buckets.METER = MAY.meter 
    WHERE (((MAY.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND MAY.kwh IS NOT NULL) 
    AS MAY16 
    , 
    (SELECT Sum(JUN.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN JUN ON Meter_Buckets.METER = JUN.meter 
    WHERE (((JUN.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND JUN.kwh IS NOT NULL) 
    AS JUN16 
    , 
    (SELECT Sum(JUL.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN JUL ON Meter_Buckets.METER = JUL.meter 
    WHERE (((JUL.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND JUL.kwh IS NOT NULL) 
    AS JUL16 
    , 
    (SELECT Sum(AUG.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN AUG ON Meter_Buckets.METER = AUG.meter 
    WHERE (((AUG.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND AUG.kwh IS NOT NULL) 
    AS AUG16 
    , 
    (SELECT Sum(SEP.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN SEP ON Meter_Buckets.METER = SEP.meter 
    WHERE (((SEP.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND SEP.kwh IS NOT NULL) 
    AS SEP16 
    , 
    (SELECT Sum(OCT.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN OCT ON Meter_Buckets.METER = OCT.meter 
    WHERE (((OCT.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND OCT.kwh IS NOT NULL) 
    AS OCT16 
    , 
    (SELECT Sum(NOV.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN NOV ON Meter_Buckets.METER = NOV.meter 
    WHERE (((NOV.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND NOV.kwh IS NOT NULL) 
    AS NOV16 
    , 
    (SELECT Sum(DEC.[kwh]) 
    FROM Peak_Times, Meter_Buckets INNER JOIN DEC ON Meter_Buckets.METER = DEC.meter 
    WHERE (((DEC.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND DEC.kwh IS NOT NULL) 
    AS DEC16 
+0

Diese wunderbar funktionierte, hatte ich nur die SELECT am Anfang ändern SELECT zu sagen * FROM da Access mir sagte ich in meinem Eingang einen Tisch haben. Vielen Dank! –

+0

Interessant ... Sie müssen wirklich Access verwenden (ich hatte dieses Tag versehentlich entfernt, aber wieder hinzugefügt). Bei SQL Server und MySQL sollte die von mir vorgeschlagene Syntax unterstützt werden, aber Access verhält sich etwas anders. – dana

0

So etwas könnte funktionieren:

WITH 
APR16 as (select ... apr16 from ...), 
MAY16 as (select ... may16 from ...), 
JUN16 as (select ... jun16 from ...) 
select apr16,may16,jun16 from APR16, MAY16, JUN16; 

Allerdings ist es nicht die eleganteste Lösung für diese Pivotti ng Problem, denke ich. Einige Datenbanken unterstützen Pivoting-Ergebnisse, ich bin mir nicht sicher, ob ms-access-2016 zu diesen gehört (ich bin mir auch nicht sicher, ob es WITH-Klauseln unterstützt).

0

so etwas wie dieses Versuchen

SELECT a.AUG16, b.JUN16 
    FROM 
    (SELECT Sum(AUG.[kwh]) AS AUG16 
    FROM Peak_Times, Meter_Buckets INNER JOIN AUG ON Meter_Buckets.METER = AUG.meter 
    WHERE (((AUG.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND AUG.kwh IS NOT NULL) 
) a 
, 
    (FROM(
    SELECT Sum(JUN.[kwh]) AS JUN16 
    FROM Peak_Times, Meter_Buckets INNER JOIN JUN ON Meter_Buckets.METER = JUN.meter 
    WHERE (((JUN.strdatetime)=[Peak_Times].[strdatetime]) AND ((Meter_Buckets.BUCKET)=1)) AND JUN.kwh IS NOT NULL) 
) b 
Verwandte Themen