我必须列出测试航班想要显示总结和到达出发和货物的总数,但我不想在组中添加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
答案 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
单独形成的组不相等,那么结果的语义(如果不应用聚合函数)是什么?