多标准案例说明

时间:2018-08-14 19:18:57

标签: sql

由于所有意图和目的,我想忽略查询的某些结果,其中一些结果是重复的,但是根据发出请求的方式,我们需要使用此层次结构,尽管看到不同的'Company_Name',我们需要忽略其中一个结果。

查询:

SELECT  
    COUNT(DISTINCT A12.Company_name) AS Customer_Name_Count,
    Company_Name,
    SUM(Total_Sales) AS Total_Sales
FROM 
    some_table AS A12
GROUP BY 
    2
ORDER BY 
    3 ASC, 2 ASC

此代码省略了半打do睡的连接,并且其中的语句与该问题无关。

结果:

  Customer_Name_Count     Company_Name           Total_Sales
-------------------------------------------------------------
1  3                       Blockbuster               1,000
2  6                       Jimmy's Bar               1,500
3  6                       Jimmy's Restaurant        1,500
4  9                       Impala Hotel              2,000
5  12                      Sports Drink              2,500

在上面的集合中,我们可以看到编号2和3具有相同的计数,相同的total_sales销售编号以及相似的公司名称。有没有一种方法可以创建一个将这三个因素都考虑在内的案例陈述,然后再为吉米的企业丢掉一个?另一个问题是,这必须是可变的,因为在其他情况下会发生这种情况。而且,我只希望这种情况发生在计数和销售编号彼此匹配且公司名称相似的情况下。

所需结果:

  Customer_Name_Count     Company_Name           Total_Sales
--------------------------------------------------------------
1  3                       Blockbuster               1,000
2  6                       Jimmy's Bar               1,500
3  9                       Impala Hotel              2,000
4  12                      Sports Drink              2,500

4 个答案:

答案 0 :(得分:1)

这个评论太长了。

您的问题是您正在使用的联接使行数相乘。一路上的某个地方,多个名称与完全相同的实体相关联(这就是数字相同的原因)。您可以通过汇总正确的ID来解决此问题:

SELECT COUNT(DISTINCT A12.Company_name) AS Customer_Name_Count,
       MAX(Company_Name) as Company_Name,
       SUM(Total_Sales) AS Total_Sales
FROM some_table AS A12
GROUP BY Company_id -- I'm guessing the column is something like this
ORDER BY 3 ASC, 2 ASC;

这实际上可能夸大了销售额(我不知道)。最好修复join,使其只返回一个名称。一种可能性是它是2类维,这意味着值随时间变化具有时间成分。您可能需要将加入限制为单个时间段。

答案 1 :(得分:1)

基于两个公司的Company_ID相同的假设,看起来其他答案是准确的。

如果Jimmy's Bar和Jimmy's Restaurant的Company_ID不同,那么您可以使用类似的名称。我建议您让功能用户参与进来并进行一些数据清理,否则,每次出现此问题时,您都将对此进行维护:

SELECT
    COUNT(DISTINCT CASE
        WHEN A12.Company_Name = 'Name2' THEN 'Name1'
        ELSE A12.Company_Name
    END) AS Customer_Name_Count
   ,CASE
        WHEN A12.Company_Name = 'Name2' THEN 'Name1'
        ELSE A12.Company_Name
    END AS Company_Name
   ,SUM(A12.Total_Sales) AS Total_Sales
FROM some_table er
GROUP BY CASE
    WHEN A12.Company_Name = 'Name2' THEN 'Name1'
    ELSE A12.Company_Name
END

答案 2 :(得分:0)

您需要具有返回公司通用名称的功能,然后使用DISTINCT

 SELECT DISTINCT 
        Customer_Name_Count, 
        dbo.GetCommonName(Company_Name) as Company_Name, 
        Total_Sales
 FROM dbo.theTable

答案 3 :(得分:0)

您可以尝试将ROW_NUMBER window函数一起使用,按Customer_Name_CountTotal_Sales生成行号,然后获取rn = 1

SELECT * FROM (
    SELECT *,ROW_NUMBER() OVER(PARTITION BY Customer_Name_Count,Total_Sales ORDER BY Company_Name) rn
    FROM (
        SELECT  
            COUNT(DISTINCT A12.Company_name) AS Customer_Name_Count,
            Company_Name,
            SUM(Total_Sales) AS Total_Sales
        FROM 
            some_table AS A12
        GROUP BY 
            Company_Name
    )t1
)t1
WHERE rn = 1