如何在select语句中找到最常见的值作为子查询?

时间:2015-11-04 20:05:01

标签: sql sql-server tsql reporting-services ssms

我正在尝试从表B中获取位置ID最频繁的Zip_Code。表A(事务)每个事务有一个A.zip_code但表B(位置)有一个区域或城市的多个Zip_code。我正在尝试使用两个表中都存在的Location_D来获取帐户中最频繁的B.Zip_Code。我已经简化了我的代码并更改了列的名称以便于理解,但这是我的查询逻辑到目前为止。任何帮助,将不胜感激。提前谢谢。

Select
           A.Account_Number,
           A.Utility_Type,
           A.Sum(usage),
           A.Sum(Cost),
           A.Zip_Code,
           ( select B.zip_Code from B where A.Location_ID= B.Location_ID  having count(*)= max(count(B.Zip_Code)) as Location_Zip_Code,
            A.Transaction_Date


From 
            Transaction_Table as A Left Join
            Location Table as B  On A.Location_ID= B.Location_ID


Group By   
              A.Account_Number,
              A.Utility_Type,
              A.Zip_Code,
              A.Transaction_Date

1 个答案:

答案 0 :(得分:1)

这就是我想出的:

Select tt.Account_Number, tt.Utility_Type, Sum(tt.usage), Sum(tt.Cost),
       tt.Zip_Code,
       (select TOP 1 l.zip_Code
        Location_Table l
        where tt.Location_ID = l.Location_ID 
        group by l.zip_code
        order by count(*) desc
       ) as Location_Zip_Code,
       tt.Transaction_Date
From Transaction_Table tt 
Group By tt.Account_Number, tt.Utility_Type, tt.Zip_Code, tt.Transaction_Date;

注意:

  • 表别名是一件好事。但是,它们应该是引用表的缩写,而不是任意字母。
  • 表别名限定列名,而不是函数。因此sum(tt.usage)而不是tt.sum(usage)
  • 外部查询不需要连接。您正在子查询中完成所有工作。
  • 带有order by的{​​{1}}似乎是获取最常见邮政编码的方式(顺便提一下,统计信息中称为模式)。