Sql 如何在单个查询中计算多个列的单个和
在windows 7客户端上使用Oracle 11gR2。我有以下示例表:Sql 如何在单个查询中计算多个列的单个和,sql,oracle,Sql,Oracle,在windows 7客户端上使用Oracle 11gR2。我有以下示例表: Yr Mnth Region City Handled_Package Expected_Missing_Package Actual_Missing_Package 2012 November Western San Fransisco 200 10
Yr Mnth Region City Handled_Package Expected_Missing_Package Actual_Missing_Package
2012 November Western San Fransisco 200 10 5
2012 November Western Los Angeles 400 20 15
2012 November Eastern New York 300 15 20
2012 November Western Seattle 100 5 7
2012 November Eastern Philadelphia 200 10 12
2012 November MidWest Chicago 300 15 15
2012 December MidWest Detroit 50 3 2
2012 December Western Los Angeles 300 15 19
2012 December Eastern New York 400 20 16
2012 December Eastern Philadelphia 150 8 6
2012 December MidWest Chicago 200 10 10
2013 January Eastern New York 200 10 9
2013 January MidWest Chicago 100 5 7
2013 January Western San Fransisco 500 25 22
2013 January Western Los Angeles 200 10 8
2013 January Europe London 500 25 27
2013 January Europe Paris 400 20 23
2013 Februray Europe London 200 10 9
2013 Februray Eastern Philadelphia 300 15 13
2013 Februray Eastern NY 400 20 18
2013 February Western San Fransisco 400 20 12
2013 Februray Western LA 200 10 8
2013 Februray MidWest Detroit 300 15 13
我想从中创建一个视图,它将存储所有数字列的总和(即已处理的\u包、预期的\u缺少的\u包、实际的\u缺少的\u包)
每个地点每年的每个月。即,输出应如下所示:
Yr Mnth Region Handled_Package Expected_Missing_Package Actual_Missing_Package
2012 November Eastern 500 25 32
2012 November Europe 0 0 0
2012 November MidWest 300 15 15
2012 November Western 700 35 27
2012 December Eastern 250 13 12
2012 November Europe 0 0 0
2012 December MidWest 550 28 22
2012 December Western 300 15 19
2013 January Eastern 200 10 9
2013 January Europe 900 45 50
2013 January MidWest 100 5 7
2013 January Western 700 35 30
2013 February Eastern 700 35 31
2013 February Europe 200 10 9
2013 February MidWest 300 15 13
2013 February Western 600 30 20
我该怎么做?为方便起见,以下是创建和插入脚本:
CREATE TABLE test
(
Yr VARCHAR2(5),
Mnth VARCHAR2(50),
Region VARCHAR2(50),
CITY VARCHAR2(50),
Handled_Package NUMBER,
Expected_Missing_Package NUMBER,
Actual_Missing_Package NUMBER
);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'Western', 'San Fransisco', 200, 10, 5);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'Western', 'Los Angeles', 400, 20, 15);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'Eastern', 'New York', 300, 15, 20);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'Western', 'Seattle', 100, 5, 7);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'Eastern', 'Philadelphia', 200, 10, 12);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'November', 'MidWest', 'Chicago', 300, 15, 15);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'December', 'MidWest', 'Detroit', 50, 3, 2);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'December', 'Western', 'Los Angeles', 300, 15, 19);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'December', 'Eastern', 'New York', 400, 20, 16);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'December', 'Eastern', 'Philadelphia', 150, 8, 6);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2012', 'December', 'MidWest', 'Chicago', 200, 10, 10);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'Eastern', 'New York', 200, 10, 9);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'MidWest', 'Chicagio', 100, 5, 7);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'Western', 'San Fransisco', 500, 25, 22);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'Western', 'Los Angeles', 200, 10, 8);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'Europe', 'London', 500, 25, 27);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'January', 'Europe', 'Paris', 400, 20, 23);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'Europe', 'London', 200, 10, 9);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'Eastern', 'Philadelphia', 300, 15, 13);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'Eastern', 'NY', 400, 20, 18);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'Western', 'San Fransisco', 400, 20, 12);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'Western', 'LA', 200, 10, 8);
Insert into TEST (YR, MNTH, REGION, CITY, HANDLED_PACKAGE, EXPECTED_MISSING_PACKAGE, ACTUAL_MISSING_PACKAGE)
Values ('2013', 'Februray', 'MidWest', 'Detroit', 300, 15, 13);
COMMIT;
如有任何帮助或建议,我将不胜感激
谢谢看起来像是一个简单的
群组
SELECT Yr,Mnth,Region,
SUM(Handled_Package) Handled_Package,
SUM(Expected_Missing_Package) Expected_Missing_Package,
SUM(Actual_Missing_Package) Actual_Missing_Package
FROM TEST
GROUP BY Yr,Mnth,Region
ORDER BY Yr,Mnth,Region
SELECT DISTINCT r.Yr,r.Mnth,r.Region,
COALESCE(SUM(t.Handled_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Handled_Package,
COALESCE(SUM(t.Expected_Missing_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Expected_Missing_Package,
COALESCE(SUM(t.Actual_Missing_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Actual_Missing_Package
FROM TEST t
RIGHT JOIN (
SELECT DISTINCT t1.Region,t2.Yr,t2.Mnth FROM TEST t1 CROSS JOIN TEST t2
) r
ON t.Yr = r.Yr AND t.Mnth=r.Mnth AND t.Region=r.Region
ORDER BY r.Yr,r.Mnth,r.Region
您的更新有些复杂,这会将不存在的区域合并为零行,并使用OVER(partitionby)
而不是groupby
SELECT Yr,Mnth,Region,
SUM(Handled_Package) Handled_Package,
SUM(Expected_Missing_Package) Expected_Missing_Package,
SUM(Actual_Missing_Package) Actual_Missing_Package
FROM TEST
GROUP BY Yr,Mnth,Region
ORDER BY Yr,Mnth,Region
SELECT DISTINCT r.Yr,r.Mnth,r.Region,
COALESCE(SUM(t.Handled_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Handled_Package,
COALESCE(SUM(t.Expected_Missing_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Expected_Missing_Package,
COALESCE(SUM(t.Actual_Missing_Package)
OVER (PARTITION BY r.Yr,r.Mnth,r.Region), 0) Actual_Missing_Package
FROM TEST t
RIGHT JOIN (
SELECT DISTINCT t1.Region,t2.Yr,t2.Mnth FROM TEST t1 CROSS JOIN TEST t2
) r
ON t.Yr = r.Yr AND t.Mnth=r.Mnth AND t.Region=r.Region
ORDER BY r.Yr,r.Mnth,r.Region
后者可能可以简化,我必须承认Oracle的分析功能不是我的专长:)Oops,我的错,对不起!我真正想要的是每个月“区域”的完整列表,如更新的输出部分所示。例如,应为11月和12月添加欧洲,其数字列应为零。还有,我将如何使用分析函数而不是简单的GROUPBY子句。请参阅我的更新答案。