簡體   English   中英

帶聯接的SQL Select查詢:如何在沒有外鍵的情況下對非主屬性的特定次數進行計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM