代码之家  ›  专栏  ›  技术社区  ›  curious1

一个SQL语句用于根据明细表中的匹配记录计算主表中的记录?

sql
  •  -1
  • curious1  · 技术社区  · 12 年前

    我有以下名为master的主表和示例数据

    ID---------------Date
    1                2014-09-07
    2                2014-09-07
    3                2014-09-08
    

    以下名为details的详细信息表

    masterId-------------Name
    1                    John Walsh
    1                    John Jones
    2                    John Carney
    1                    Peter Lewis
    3                    John Wilson
    

    现在,我想找出主记录的计数(分组在Date列上),其对应的详细信息记录Name的值为“John”。

    我想不出如何为这项工作编写一条SQL语句。

    **请注意,为了查找计数的主记录,需要联接。但是,这种联接会为count创建重复的主记录。在Master表的Date列上分组时,我需要从计数中删除这些重复记录。

    正确的结果应该是:

    count:           grouped on Date column
    2                2014-09-07
    1                2014-09-08
    

    **

    谢谢和问候!

    2 回复  |  直到 12 年前
        1
  •  1
  •   Elias    12 年前

    此答案假设如下

    • Name字段始终为FirstName LastName
    • 你只找过一次约翰的名字。搜索条件会有所不同,取决于您需要什么

    SELECT Date, Count(*)
    FROM tblmaster 
    INNER JOIN tbldetails ON tblmaster.ID=tbldetails.masterId 
    WHERE NAME LIKE 'John%'
    GROUP BY Date, tbldetails.masterId
    

    我们在这里做的是使用 wilcard 字符串搜索中的字符表示“在任何长度的字符后面查找John”。

    此外,这里还有一种基于我们正在使用的内容创建表变量的方法

    DECLARE @tblmaster as table(
    ID  int,
    [date] datetime
    )
    
    DECLARE @tbldetails as table(
    masterID  int,
    name varchar(50)
    )
    
    INSERT INTO @tblmaster (ID,[date])
    VALUES
    (1,'2014-09-07'),(2,'2014-09-07'),(3,'2014-09-08')
    
    INSERT INTO @tbldetails(masterID, name) VALUES
    (1,'John Walsh'),
    (1,'John Jones'),
    (2,'John Carney'),
    (1,'Peter Lewis'),
    (3,'John Wilson')
    

    根据下面的所有评论,这条SQL语句在其笨拙的荣耀中应该能起到作用。

    SELECT date,count(t1.ID) FROM @tblmaster mainTable INNER JOIN 
    ( 
        SELECT ID, COUNT(*)  as countOfAll
        FROM @tblmaster  t1
        INNER JOIN @tbldetails t2 ON t1.ID=t2.masterId 
        WHERE NAME LIKE 'John%' 
        GROUP BY id) 
    as t1 on t1.ID = mainTable.id 
    GROUP BY mainTable.date
    
        2
  •  0
  •   Gordon Linoff    12 年前

    这是你想要的吗?

    select date, count(distinct m.id)
    from master m join
         details d
         on d.masterid = m.id
    where name like '%John%'
    group by date;