【发布时间】:2018-07-09 11:23:56
【问题描述】:
我有以下三个表:
CREATE TABLE CUSTOMERS
(customerID INT PRIMARY KEY,
customerZip VARCHAR(15) NOT NULL);
CREATE TABLE VEHICLES
(vehicleVIN VARCHAR(25) PRIMARY KEY,
vehicleModel VARCHAR(15) NOT NULL);
CREATE TABLE SALES
(saleID INT PRIMARY KEY,
customerID INT,
vehicleVIN VARCHAR(25),
CONSTRAINT SALES_FK1 FOREIGN KEY (customerID) REFERENCES CUSTOMERS(customerID),
CONSTRAINT SALES_FK2 FOREIGN KEY (vehicleVIN) REFERENCES VEHICLES(vehicleVIN));
我正在尝试开发一个查询来连接这三个表并生成一个输出,该输出显示按型号的销售总数和按邮政编码的销售总数,首先按最高值排序。输出应该类似于:
vehicleModel Sales_By_Model customerZip Sales_By_ZIP
S-10 12 18956 3
Silverado 10 22789 2
F-150 9 12345 2
我已经尝试了以下代码,但我不认为这是正确对待这头公牛的方法,因为它没有将车辆模型合并为 Sales_By_Model 的总数:
SELECT DISTINCT v.vehicleModel, COUNT(*) OVER (PARTITION BY s.vehicleVIN) "SALES_BY_MODEL", c.customerZip, COUNT(*) OVER (PARTITION BY c.customerZip )"SALES_BY_ZIP"
FROM SALES s, VEHICLES v, CUSTOMERS c
WHERE s. vehicleVIN = v. vehicleVIN
and c. customerID = s. customerID
ORDER BY 2 DESC , 4 DESC;
这是我从上面的查询中得到的输出:
VEHICLEMODEL SALES_BY_MODEL CUSTOMERZIP SALES_BY_ZIP
accord 1 89523 6
altima 1 89523 6
escalade 1 89523 6
f-150 1 89523 6
impala 1 89523 6
尽管查询确实提取了必要的数据并连接了表,但它并没有组合车辆模型来增加 SALES_BY_MODEL 的计数。 customerZIP 也是如此,尽管它似乎至少正确计算了 zip 的数量。
我的问题是:有没有办法查询这些表以获取结合了 vehicleModel 和 customerZip 计数的结果?如果是这样,我该怎么做?通过显式调用 JOIN,我知道我上面使用的查询不是完全正确的 SQL 语法。我的目标是在 ONE SELECT Query 中完成此操作。
提前感谢您的指导/帮助!
编辑:下面是几行示例输入数据:
INSERT INTO CUSTOMERS
(customerID,customerFirName,customerLasName,customerMiName,customerStreet,customerState,customerCity,customerZip)
VALUES
(1,'Steven','Christman','J','11111 Address Way','Maryland','Hollywood','20636');
INSERT INTO CUSTOMERS
(customerID,customerFirName,customerLasName,customerMiName,customerStreet,customerState,customerCity,customerZip)
VALUES
(2,'Bob','Seagram','A','22222 Seagram Lane','Texas','Houston','77001');
INSERT INTO CUSTOMERS
(customerID,customerFirName,customerLasName,customerMiName,customerStreet,customerState,customerCity,customerZip)
VALUES
(3,'Sally','Anderson','P','33333 Pheonix Drive','Arizona','Pheonix','85001');
INSERT INTO VEHICLES
(vehicleVIN,vehicleType,vehicleMake,vehicleModel,vehicleWhereFrom,vehicleWholesaleCost,vehicleTradeID)
VALUES
('147258HHE91K3RT','compact','chevrolet','spark','Maryland',20583.00,NULL);
INSERT INTO VEHICLES
(vehicleVIN,vehicleType,vehicleMake,vehicleModel,vehicleWhereFrom,vehicleWholesaleCost,vehicleTradeID)
VALUES
('789456ERT0923RFB6','Midsize','ford','Taurus','washington, d.c.',25897.22,1);
INSERT INTO VEHICLES
(vehicleVIN,vehicleType,vehicleMake,vehicleModel,vehicleWhereFrom,vehicleWholesaleCost,vehicleTradeID)
VALUES
('1234567890QWERTYUIOP','fullsize','Lincoln','towncar','Virginia',44222.10,NULL);
INSERT INTO SALES
(saleID,grossSalePrice,vehicleStatus,saleDate,saleMileage,customerID,salespersonID,vehicleVIN)
VALUES
(1,25987.28,'sold',date '2012-10-15',10,1,1,'147258HHE91K3RT');
INSERT INTO SALES
(saleID,grossSalePrice,vehicleStatus,saleDate,saleMileage,customerID,salespersonID,vehicleVIN)
VALUES
(2,29999.99,'sold',date '2012-10-17',50087,2,2,'789456ERT0923RFB6');
INSERT INTO SALES
(saleID,grossSalePrice,vehicleStatus,saleDate,saleMileage,customerID,salespersonID,vehicleVIN)
VALUES
(3,47490.88,'sold',date '2012-11-05',30,3,3,'1234567890QWERTYUIOP');
您可能会注意到,上面的输入数据反映了对我在原始帖子中未列出的其他一些属性的输入(我在此处显示了表格创建),因为这些属性中的大多数与此处的目标无关。
【问题讨论】:
-
您似乎试图将两个完全独立的查询合并为一个,这是不明智的。如果只有 5 种车辆型号但有 9 个客户邮政编码,那么您的报告应该是什么样的?只需编写两个查询并在需要时将它们并排显示。
-
拥有与示例输出结果相对应的示例输入数据将非常有帮助。因为,正如@TonyAndrews 指出的那样,尝试将这两个指标结合起来至少感觉“尴尬”。您是否尝试显示“型号和 Zip 的每个组合”,然后在这些维度旁边包含“该型号的销售量,无论 Zip”以及“该 Zip 销售了多少,无论model”,但实际上在任何给定行上都没有特定于 Model/Zip 的任何指标?
-
不幸的是,我这样做是基于我得到的指示。 customerZIP 和vehicleMake 不必“链接”,这意味着vehicleMake 属性“S-10”不一定必须由customerZip 属性“18956”中的客户购买。我得到的具体说明是“显示销售总数,按型号,然后按邮政编码,首先通过单个选择查询显示最高值。给定的,我不相信他们必须是并排。这正是我认为更容易展示的方式。
-
因此,在您的示例中,
S-10的 12 次销售与 Zip18956的 3 次销售没有任何关系? ?即使它们在同一数据集的同一行上? -
@MatBailie 不需要显示model和zip的组合。把它想象成两个并排的单独列表。一个显示型号列表和按型号销售,另一个显示邮政编码列表和按邮政编码销售。两者不需要捆绑在一起,除了它们需要通过相同的查询显示。现在添加输入数据。谢谢!
标签: sql oracle sorting join window-functions