【问题标题】:SINGLE SELECT Query for MAX Count with JOIN使用 JOIN 查询 MAX Count 的 SINGLE SELECT
【发布时间】:2018-01-25 01:25:28
【问题描述】:

我有三个表:Customers、Vehicles 和 Sales。我需要一个 SELECT 语句,它将形成一个包含三列的输出:VEHICLEMAKE、SALESBYMAKE 和 CUSTOMERFULLNAME。输出应类似于以下内容:

VEHICLEMAKE SALES_BY_MAKE CUSTOMERFULLNAME

Chevrolet              11 Adam E Whitney           
                          Alberto L Ross           
                          Alexis T Moon            
                          Finley H Tritt           
                          Jayda V Rush             
                          Junior E Hanes           
                          Kamari H Webster         
                          Linda L Lawrence         
                          Luke E Boyer             
                          Samantha D Holden        
                          Sydnee B Herman 

该列表应仅包含 SALESBYMAKE 的 MAX 数量,除非 MAX 绑定,否则它还将包含 VEHICLEMAKE、SALESBYMAKE 数量和其他 VEHICLEMAKE 的 CUSTOMERFULLNAME。我已经工作了几个小时,完全没有用!这是表格,仅包含必要的属性。

CREATE TABLE CUSTOMERS
(customerID     INT     PRIMARY KEY,
customerFirName     VARCHAR(20) NOT NULL,
customerLasName     VARCHAR(20) NOT NULL,
customerMiName      VARCHAR(1)  NOT NULL;

CREATE TABLE VEHICLES
(vehicleVIN     VARCHAR(25) PRIMARY KEY,
vehicleMake     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);

编辑:这是我尝试过的:

SELECT DISTINCT v.VEHICLEMAKE, COUNT(*) OVER (PARTITION BY s.VEHICLEVIN) "SALES_BY_MAKE", c.CUSTOMERFULLNAME, COUNT(*) OVER (PARTITION BY c.CUSTOMERZIP)"CUSTOMERS"
FROM SALES s, VEHICLES v, CUSTOMERS c
WHERE s. VEHICLEVIN = v. VEHICLEVIN
and c. CUSTOMERID = s. CUSTOMERID
ORDER BY 2 DESC;

问题是,这给了我整个列表,而不是 MAX 值。我不确切知道在哪里或如何实施 MAX 语句,以仅包含购买最多的 VEHICLE MAKE。

按照我问过的另一个人的建议,我也尝试过这个,但无法理解它并且它没有正确执行。

SELECT vc.*
FROM (SELECT vc.*, MAX(SALES_BY_MAKE) OVER () as MAX_SALES_BY_MAKE
  FROM (SELECT v.VEHICLEMAKE, c.CUSTOMERFULLNAME,
               COUNT(*) OVER (PARTITION BY s.VEHICLEVIN) as SALES_BY_MAKE
        FROM SALES s JOIN
             VEHICLES v
             ON s.VEHICLEVIN = v VEHICLEVIN JOIN
             CUSTOMERS c
             ON c.CUSTOMERID = s.CUSTOMERID 
       ) vc
 ) vc
WHERE SALES_BY_MAKE = MAX_SALES_BY_MAKE
ORDER BY VEHICLEMAKE;

我认为我尝试的第一个方法是正确的方法,因为它确实提供了我需要的列表,但是它不仅选择了 MAX 值,而是提供了所有值和将它们从高到低排序。我考虑过添加一个 LIMIT,但这不允许出现“平局”。

我真的只需要关于在哪里/如何实施 MAXcount 以获得最高输出的指导。

【问题讨论】:

  • 这不是代码/SQL/正则表达式编写服务,您可以在其中发布您的需求和选择的语言列表,然后代码猴子会为您生成代码。我们非常乐意提供帮助,但我们希望您首先努力自己解决问题。 (不,我会上传它,但是... 不算努力,就像 诚实,我做了功课,但我的狗吃了它)。完成后,您可以解释您遇到的问题,包括您工作的相关部分,并提出具体问题,我们会尽力提供帮助。祝你好运。
  • 是的!你可以做到的。
  • I'd upload what I've tried 急于看到这一点,它不会让我们感到困惑。
  • 我很抱歉。我真的认为这会增加混乱。不会再犯这种错误了。不要试图让你“免费”工作。编辑后的帖子包括我尝试过的内容以及我需要帮助的具体问题。再次感谢。
  • 看看GROUP BY

标签: sql oracle join max


【解决方案1】:

试试这个查询,它只是重复前两列的值

SELECT  C.vehicleMake,C.nCount,B.customerFirName + ' ' + B.customerMiName     + ' ' + B.customerLasName cFullName
FROM SALES A
JOIN CUSTOMERS B ON A.customerID = B.customerID
JOIN    (
    SELECT A.vehicleVIN,B.vehicleMake,COUNT(*) nCount
    FROM SALES
    JOIN VEHICLES B ON A.vehicleVIN = B.vehicleVIN
    GROUP BY A.vehicleVIN,B.vehicleMake
    )C ON A.vehicleVIN = C.vehicleVIN

【讨论】:

  • 刚试过这个......不幸的是它不起作用。这是错误:第 7 行的错误:ORA-00904:“A”。“VEHICLEVIN”:无效标识符也无法弄清楚原因。有什么想法吗?谢谢!
  • 抱歉,我错过了 sales 表的别名。尝试在查询最后一部分的销售表上放置别名“A”。我不知道这是否适用于 oracle,但在 sql server 中它是一个有效的查询。
  • 知道了。我会试试看!看起来很简单,逻辑对我来说很有意义。我今晚会运行它,如果它在 Oracle 中工作,我会更新你。我不明白为什么它不会。语法似乎相同。
  • 我刚刚运行它,虽然它执行时没有错误,但它仍然不正确。这基本上是制作销售清单,将出售的车辆与买家配对。它不是仅列出一个品牌(例如雪佛兰)的输出,而是列出所有品牌。与其只列出雪佛兰销售数量的一个销售数量,而是所有产品的销售数量为“1”,并且该列表反映了所有客户,而不仅仅是那些购买了顶级汽车的客户。关于我们在哪里出错的任何指导?
  • 这是对SQL Server的查询,不知道Oracle是否也是这样。
【解决方案2】:

这最终成功了!

WITH
vehicleMakeCount AS
(
    SELECT
        SALES.saleID, SALES.customerID, SALES.vehicleVIN, VEHICLES.vehicleMake,
        COUNT(*) OVER (PARTITION BY VEHICLES.vehicleMake) AS salesByMake
    FROM
        SALES
        INNER JOIN
            VEHICLES ON VEHICLES.vehicleVIN  = SALES.vehicleVIN
),
salesRank AS
(
    SELECT
        vehicleMakeCount.*,
        RANK() OVER (ORDER BY salesByMake DESC)   AS vehicleMakeSalesRank
    FROM
        vehicleMakeCount
)
SELECT CUSTOMERS.customerFullName, salesRank.vehicleMake
FROM
salesRank
    INNER JOIN
    CUSTOMERS
    ON CUSTOMERS.customerID = salesRank.customerID
    WHERE
    salesRank.vehicleMakeSalesRank = 1
    ORDER BY salesRank.vehicleMake;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2012-12-26
    • 2011-12-11
    • 1970-01-01
    • 2019-10-23
    相关资源
    最近更新 更多