[英]SQL Select Query with Join: How to Count a Certain Number of Occurences on non-primary Attribute without a Foreign Key
使用下表:
CREATE TABLE CUSTOMERS
(customerID INT PRIMARY KEY,
customerFullName VARCHAR(20) NOT NULL,
customerStreet VARCHAR(40) NOT NULL,
customerState VARCHAR(15) NOT NULL,
customerCity VARCHAR(20) NOT NULL,
customerZip VARCHAR(15) NOT NULL);
CREATE TABLE VEHICLES
(vehicleVIN VARCHAR(25) PRIMARY KEY,
vehicleType VARCHAR(10) NOT NULL CHECK (lower(vehicleType) IN ('compact', 'midsize', 'fullsize', 'suv', 'truck')),
vehicleMake VARCHAR(15) NOT NULL,
vehicleModel VARCHAR(15) NOT NULL,
vehicleWhereFrom VARCHAR(20) NOT NULL CHECK (lower(vehicleWhereFrom) IN ('maryland','virginia','washington, d.c.')),
vehicleWholesaleCost DECIMAL(9,2) NOT NULL,
vehicleTradeID INT);
CREATE TABLE SALES
(saleID INT PRIMARY KEY,
grossSalePrice DECIMAL(9,2),
vehicleStatus VARCHAR(10) NOT NULL CHECK (lower(vehicleStatus) IN ('available', 'sold', 'pending')),
saleDate DATE,
saleMileage INT,
customerID INT,
salespersonID INT,
vehicleVIN VARCHAR(25),
CONSTRAINT SALES_FK1 FOREIGN KEY (customerID) REFERENCES CUSTOMERS(customerID),
CONSTRAINT SALES_FK2 FOREIGN KEY (vehicleVIN) REFERENCES VEHICLES(vehicleVIN));
我建立了以下查詢,以顯示涉及最多銷售額的vehicleMake和購買該品牌車輛的所有人的customerFullName:
SELECT VEHICLES.vehicleMake, CUSTOMERS.customerFullName
FROM SALES
JOIN CUSTOMERS on SALES.customerID = CUSTOMERS.customerID
JOIN(
SELECT SALES.vehicleVIN, VEHICLES.vehicleMake
FROM SALES
JOIN VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
GROUP BY SALES.vehicleVIN, VEHICLES.vehicleMake
HAVING COUNT(SALES.vehicleVIN) >= ALL
(SELECT COUNT(SALES.vehicleVIN)
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVIN=VEHICLES.vehicleVIN
GROUP BY VEHICLES.vehicleMake))
VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
ORDER BY CUSTOMERS.customerFullName;
當我在Oracle NOVA DB中運行此程序時,結果僅是“未選擇行”。 我懷疑這是因為以下子句是在計算出售車輛VIN的次數,而不是在計算出售VehicleMake的次數。
HAVING COUNT(SALES.vehicleVIN) >= ALL
(SELECT COUNT(SALES.vehicleVIN)
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVin=VEHICLES.vehicleVIN
GROUP BY VEHICLES.vehicleMake))
VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
ORDER BY CUSTOMERS.customerFullName;
我將如何更改此SELECT Count子查詢來計算vehicleMake出現的次數而不是vehicleVIN出現的次數? 我正在尋找的輸出是:
vehicleMake customerFullName
CAR2 Bob Jim
CAR2 Jim Bob
CAR2 Steve France
CAR2 Tom Williams
CAR2 John Johnson
它應該只顯示銷售量最大的vehicleMake中的vehicleMake,以及購買該品牌任何車輛的人的customerFullName。 如果要查看我已構建的架構,請參見以下SQL Fiddle的鏈接: http : //sqlfiddle.com/#!4/b0ac3a
http://sqlfiddle.com/#!4/b0ac3a/67
WITH
tallied_sales AS
(
SELECT
SALES.*,
VEHICLES.vehicleMake,
COUNT(*) OVER (PARTITION BY VEHICLES.vehicleMake) AS vehicleMakeSales
FROM
SALES
INNER JOIN
VEHICLES
ON VEHICLES.vehicleVIN = SALES.vehicleVIN
),
ranked_sales AS
(
SELECT
tallied_sales.*,
RANK() OVER (ORDER BY vehicleMakeSales DESC) AS vehicleMakeSalesRank
FROM
tallied_sales
)
SELECT
*
FROM
ranked_sales
INNER JOIN
CUSTOMERS
ON CUSTOMERS.customerID = ranked_sales.customerID
WHERE
ranked_sales.vehicleMakeSalesRank = 1
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.