SQL group by remove column

时间:2015-08-13 09:28:22

标签: sql database

我必须列出测试航班想要显示总结和到达出发和货物的总数,但我不想在组中添加opdate但我需要它在选择

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

2 个答案:

答案 0 :(得分:0)

您可以使用SUM() OVER (PARTITION BY )。假设您使用的是 oracle

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

答案 1 :(得分:0)

只有在属性上应用聚合函数(MIN,MAX等)时,才能在SELECT子句中使用属性而不在GROUP BY中。我不明白的是,为什么你不在GROUP BY子句中呢?如果您知道,由Nat单独形成的每个组都会产生相等的opdate值,则向GROUP BY添加opdate不会改变结果。如果opdate的值与由Nat单独形成的组不相等,那么结果的语义(如果不应用聚合函数)是什么?