【问题标题】:SQL Statement to Remove Duplicates and get Counts删除重复项并获取计数的 SQL 语句
【发布时间】:2019-12-17 18:25:27
【问题描述】:

我持续的 SQL 头痛...

如果我运行这个解释代码:

SELECT State, Name, ID
FROM ...
WHERE Lost=False

我会得到类似下面的回复:

State        Name        ID
NY            A          123
NY            A          123
NY            B          234
NY            C          345
MD            X          356
MD            Y          668

我真正需要的是每个州的资源数量的总和。这里的问题是,如果我只是执行以下操作,则不会考虑到明显重复(请参阅上面的前两条记录)。

 SELECT state, Count(state) AS statecount
    FROM ....
   GROUP BY state, Lost
   HAVING Lost=false

如何在仅提取不同记录的同时计算每个状态的记录数(其中 lost = false)? 我想也许可以将 DISTINCT 放在第一个查询中,然后在 ColdFusion 中运行一个查询的查询,但是您不能在子查询中执行聚合之类的操作。

基本上,以上面为例,我最终想要这个:

            State      Count
              NY          3 (not 4!)
              MD          2

我应该注意...这是在 Access 中

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    显然 Access 2007 支持内联视图。所以你可以这样做。 (我不知道早期版本)

    SELECT 
       state,
       COUNT(CR_ID )
    
       FROM
    
       (
    
    
           SELECT  DISTINCT 
           lkuState.StateName AS state, 
           tblMain.CR_ID 
           FROM lkuState 
           INNER JOIN 
           (tblMain 
           INNER JOIN (locLink 
           INNER JOIN tblLoc 
           ON locLink.GEOMETRY_ID = tblLoc.GEOMETRY_ID) 
           ON tblMain.CR_ID = locLink.CR_ID) 
           ON lkuState.FIPS_State = tblLoc.FIPS_State 
    
           WHERE tblMain.Lost=False) t
    
    GROUP BY
    State
    

    更新

    正如下面的 David-W-Fenton 注释,关于我不确定哪些版本支持派生表/内联视图

    Jet/ACE 长期以来一直支持派生表,尽管过去的语法与简单的 (SELECT...) As Alias 完全不同——它是 [SELECT...]。请注意右方括号上的尾随句点,这排除了需要内部方括号的 SQL SELECT

    【讨论】:

    • 我收到一个错误:没有分组或聚合的 HAVING 子句 (tblMain.Lost=0)。
    • @stuttsdc 抱歉应该是哪里
    • 我想就是这样!甜的!如果我弄错了,我会告诉你,但到目前为止这看起来不错。
    • Jet/ACE 长期以来一直支持派生表,尽管语法过去与简单的(SELECT...) As Alias 完全不同——它是[SELECT...]. As Alias。请注意右方括号上的尾随句点,这排除了需要内部方括号的 SQL SELECT。在现代版本的 Access 中,我不清楚 () 语法在何时何地可靠可用。我认为它需要打开 SQL 92 模式,但我不相信它。
    • @David-W-Fenton Nice。我希望我早点知道这件事。我已更新我的答案以包含您的评论。
    【解决方案2】:

    首先创建一个视图:

    SELECT DISTINCT State, Name FROM OriginalTable
    

    然后,在您更大的查询中,用 OriginalTable 替换您从中提取此信息的表。

    【讨论】:

      【解决方案3】:

      首先使用在表中添加一个标识列

      alter table ATTENDANCE add AUTOID INT IDENTITY
      

      然后在查询下面运行

      Select State,count(*) as cnt
      FROM TableName
      WHERE AUTOID IN (SELECT MAX(AUTOID) FROM TableName GROUP BY State, Name, id)
      group by State
      having count(*) > 1
      

      【讨论】:

        【解决方案4】:

        这是一种名为“SPL”的语言,只需一行代码即可:

        file("d:/table.xlsx").xlsimport@tx().group(State;~.icount(ID):count)
        

        如下附件所示:

        【讨论】:

        • 我不认为用完全不同的语言回答一个相当具体的问题很有帮助。特别是因为这个似乎是基于 Excel 文件的,而电子表格和数据库并不是真正可以互换的
        • 这个问题不限于mysql或oracle数据库,我只展示另一种语言可能更容易描述数据计算;如果您的数据来自数据库,请将代码更改为: connect("mysqlDB").query("select * from table").group(State;~.icount(ID):count) 来自 csv 文件,然后是 file("table. csv").import@t(;",").group(State;~.icount(ID):count) 其他任何类型的数据源。我的英语很差,对不起:)
        【解决方案5】:
        SELECT state, Count(distinct ID) AS statecount
        FROM ....
        GROUP BY state, Lost
        HAVING Lost=false
        

        【讨论】:

        • 嗯.. 不要认为这在 Access 中有效。我希望它会这么简单,但我得到了一个语法错误:查询表达式中缺少运算符'Count(distinct tblMain.CR_ID)' 这是我的完整查询:SELECT lkuState.StateName AS state, Count(distinct tblMain.CR_ID ) 作为来自 lkuState INNER JOIN 的 statecount (tblMain INNER JOIN (locLink INNER JOIN tblLoc ON locLink.GEOMETRY_ID = tblLoc.GEOMETRY_ID) ON tblMain.CR_ID = locLink.CR_ID) ON lkuState.FIPS_State = tblLoc.FIPS_State GROUP BY lkuState.StateName, tblMain。丢失 HAVING (((tblMain.Lost)=False));
        • @stutsdc。访问不支持count(distint),所以看看这个方法blogs.office.com/b/microsoft-access/archive/2007/09/19/…
        • 是的,我看到了。但不幸的是,我在语法上遇到了一些麻烦。不应该这么让人抓狂吗……
        • 在发布之前,您应该检查目标 SQL 方言是否支持您建议的命令。另一个发布 Count(distinct) 的人已经删除了他的答案。在这里似乎也很合适。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 2017-12-04
        • 2019-07-07
        • 2017-01-05
        • 2021-08-04
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多