2015-08-13 2 views
0

У меня есть список тестовых полетов, которые хотят показать сводку и общее количество вылета и груза прибытия, однако я не хочу добавлять opdate в группу, но мне нужно, чтобы она была в выборГруппа SQL по удалению столбца

SELECT Nat 
    ,opdate 
    ,SUM(Arrival) AS Arr 
    ,SUM(Depart) AS Dep 
    ,SUM(APAX) AS [Arr Pax] 
    ,SUM(DPAX) AS [Dep Pax] 
    ,SUM(ATRX) AS [Arr Trx] 
    ,SUM(AFRT) AS [Arr Frt] 
    ,SUM(DFRT) AS [Dep Frt] 
FROM (
    SELECT ArrNatuFull AS Nat 
     ,CONVERT(DATE, ATA) AS opdate 
     ,1 AS Arrival 
     ,AR1PAX AS APAX 
     ,AR1FRT AS AFRT 
     ,AR1TRA AS ATRX 
     ,0 AS Depart 
     ,0 AS DPAX 
     ,0 AS DFRT 
    FROM daily.dbo.Daily 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute1 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS opdate 
     ,0 AS Expr1 
     ,AR2PAX 
     ,AR2FRT 
     ,AR2TRA 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
    FROM daily.dbo.Daily AS Daily_7 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute2 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS Expr1 
     ,0 AS Expr2 
     ,AR3PAX 
     ,AR3FRT 
     ,AR3TRA 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
    FROM daily.dbo.Daily AS Daily_6 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute3 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS Expr1 
     ,0 AS Expr2 
     ,AR4PAX 
     ,AR4FRT 
     ,AR4TRA 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
    FROM daily.dbo.Daily AS Daily_5 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (Aroute4 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,1 AS Expr6 
     ,DR1PAX 
     ,DR1FRT 
    FROM daily.dbo.Daily AS Daily_4 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute1 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR2PAX 
     ,DR2FRT 
    FROM daily.dbo.Daily AS Daily_3 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute2 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR3PAX 
     ,DR3FRT 
    FROM daily.dbo.Daily AS Daily_2 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute3 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR4PAX 
     ,DR4FRT 
    FROM daily.dbo.Daily AS Daily_1 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (Droute4 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 
    ) AS anything 
GROUP BY Nat 
    ,opdate 
+0

Какую базу вы используете? Oracle, Ms SQL, ???? –

ответ

0

Вы можете использовать SUM() OVER (PARTITION BY). Предполагая, что вы используете оракул:

SELECT Nat 
    ,opdate 
    ,SUM(Arrival) OVER (PARTITION BY Nat) AS Arr 
    ,SUM(Depart) OVER (PARTITION BY Nat) AS Dep 
    ,SUM(APAX) OVER (PARTITION BY Nat) AS [Arr Pax] 
    ,SUM(DPAX) OVER (PARTITION BY Nat) AS [Dep Pax] 
    ,SUM(ATRX) OVER (PARTITION BY Nat) AS [Arr Trx] 
    ,SUM(AFRT) OVER (PARTITION BY Nat) AS [Arr Frt] 
    ,SUM(DFRT) OVER (PARTITION BY Nat) AS [Dep Frt] 
FROM (
    SELECT ArrNatuFull AS Nat 
     ,CONVERT(DATE, ATA) AS opdate 
     ,1 AS Arrival 
     ,AR1PAX AS APAX 
     ,AR1FRT AS AFRT 
     ,AR1TRA AS ATRX 
     ,0 AS Depart 
     ,0 AS DPAX 
     ,0 AS DFRT 
    FROM daily.dbo.Daily 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute1 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS opdate 
     ,0 AS Expr1 
     ,AR2PAX 
     ,AR2FRT 
     ,AR2TRA 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
    FROM daily.dbo.Daily AS Daily_7 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute2 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS Expr1 
     ,0 AS Expr2 
     ,AR3PAX 
     ,AR3FRT 
     ,AR3TRA 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
    FROM daily.dbo.Daily AS Daily_6 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (ARoute3 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT ArrNatuFull 
     ,CONVERT(DATE, ATA) AS Expr1 
     ,0 AS Expr2 
     ,AR4PAX 
     ,AR4FRT 
     ,AR4TRA 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
    FROM daily.dbo.Daily AS Daily_5 
    WHERE (ATA > '2009-12-31 00:00') 
     AND (ATA < '2015-08-01 23:59') 
     AND (Aroute4 IS NOT NULL) 
     AND (ArrNatuFull <> 'NON') 
     AND (ArrStOk <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,1 AS Expr6 
     ,DR1PAX 
     ,DR1FRT 
    FROM daily.dbo.Daily AS Daily_4 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute1 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR2PAX 
     ,DR2FRT 
    FROM daily.dbo.Daily AS Daily_3 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute2 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR3PAX 
     ,DR3FRT 
    FROM daily.dbo.Daily AS Daily_2 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (DRoute3 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 

    UNION ALL 

    SELECT DepNatuFull 
     ,CONVERT(DATE, ATD) AS Expr1 
     ,0 AS Expr2 
     ,0 AS Expr3 
     ,0 AS Expr4 
     ,0 AS Expr5 
     ,0 AS Expr6 
     ,DR4PAX 
     ,DR4FRT 
    FROM daily.dbo.Daily AS Daily_1 
    WHERE (ATD > '2009-12-31 00:00') 
     AND (ATD < '2015-08-01 23:59') 
     AND (Droute4 IS NOT NULL) 
     AND (DepNatuFull <> 'NON') 
     AND (DepStOK <> 0) 
    ) AS anything 
0

Имея атрибут в ЗЕЬЕСТ, а не в GROUP BY возможно только, если применить агрегатную функцию (MIN, MAX и т.д.) на атрибутах. Я не понимаю, почему вы не делаете это в GROUP BY? Если вы знаете, что каждая группа, которая сформирована только Nat, приводит к равным значениям opdate, добавив opdate в GROUP BY, не изменяя результат. Если значения opdate не равны с группой, которые сформированы только Nat, что такое семантика (если вы не применяете агрегированную функцию) к вашему результату?