【问题标题】:Merge two sql queries select and count合并两个sql查询select和count
【发布时间】:2015-05-26 08:17:42
【问题描述】:

您好,我有两个 sql 查询,我想合并或合并它们

查询1:

Select TableA.Name, TableB.Date
from TableA, TableB
where ID = ID_used;

查询2:

SELECT count(Date)
FROM  (SELECT DISTINCT Date
       FROM TableA, TableB
       group by Date;

我试过了:

  Select TableA.Name, TableB.Date
  from TableA, TableB
  where ID=ID_used inner join (SELECT count(Date)
                               FROM (SELECT DISTINCT Date
                                     FROM TableA, TableB
                                     group by Date)

但在联合查询中会出现语法错误。

我需要的结果:名字,计数结果。

有什么想法吗?

测试数据:

    TableA
    ---------------------
    Name            ID
    ---------------------
    John           1001
    Peter          1002

    TableB
    -----------------------
    Date            ID_used
    -----------------------
    2015.05.01.AM   1001
    2015.05.01.AM   1001
    2015.05.01.AM   1002
    2015.05.01.PM   1001
    2015.05.01.PM   1001
    2015.05.01.PM   1002
    2015.05.01.PM   1002
    2015.05.02.PM   1002

结果必须是:

    John       2
    Peter      3

【问题讨论】:

  • 你能展示一些数据和预期的结果吗?查询 #2 在执行 GROUP BY 之前产生一个 CROSS JOIN。
  • 您的结果中的每一行是否只需要相同的结果(如总共有多少个指定日期)?
  • 提示:计数(和计数)。数字必须匹配!
  • 我想计算列中每个名称的日期。计数效果很好,但仅适用于名称。这就是我尝试组合的原因。(最终目标是将结果列出)
  • Jeremy C. 目标是获取每个名称/不同的日期(用于 ID)。我将编辑问题并提供一些示例数据

标签: sql


【解决方案1】:

据我了解,您需要的是这样的: (虽然我不确定,因为你没有添加测试数据和预期结果)

选择 t1.Name,t2.Date, (选择计数(日期) 从(选择不同的日期 从表 A,表 B 按日期分组))作为日期计数 从表 A t1 加入TableB t2 在 t1.ID = t2.ID_used

更新:我想这就是你要找的东西:SQLFIDDLE

select t1.id, t1.name, count(t2.Date)
FROM TableA t1
JOIN (
SELECT Distinct id_used,Date
FROM TableB) t2
ON t1.id = t2.id_used
GROUP by t1.id

编辑:我在 ms access 2010 中试过这个:

注意:我不能使用关键字 Date 作为列名,所以改为 mydate

select t1.id, t1.name, count(t2.mydate) as datecount
FROM TableA t1,
 (SELECT Distinct id_used,mydate
FROM TableB) t2
WHERE  t1.id = t2.id_used
GROUP by t1.id,t1.name

这行得通,但我不建议使用没有 join 或 on 关键字的连接,所以这里有一个更易读且也有效的连接:

select t1.id, t1.name, count(t2.mydate) as datecount
FROM TableA t1
INNER JOIN (
SELECT Distinct id_used,mydate
FROM TableB) t2
ON t1.id = t2.id_used
GROUP by t1.id,t1.name

【讨论】:

  • 谢谢。但是 sql 测试在 'From' 语法中写了一些错误
  • 它可能在子查询中,您在发布之前测试过您的子查询吗?它返回数据了吗?
  • 你能不能设置一些测试数据,我刚刚看了你的编辑,这可能不是你需要的
  • 你的测试数据很清楚,我的回答没用,实际上可能比我想象的要简单
  • 2015.05.01.AM 是字符串格式,因为 -- 如果日期小于 12,则数据将为 2015.05.01.AM。 12-14:00 之间禁止入场。这段时间之后数据将是 2015.05.01.PM 比我可以更容易地处理入口,我不需要从 2015.05.01 转换。 00-12:00 至 2015.05.01.AM.
【解决方案2】:

这将为 tableA 中的每个 Name 返回 tableB 中不同日期的计数:

Select a.Name, COUNT(DISTINCT b.Date)
from TableA AS a JOIN TableB AS b
ON ID=ID_used
group by a.Name

【讨论】:

  • 查询表达式'count(distinct b. date)'中缺少运算符的语法错误可能是什么问题?
  • @Zoltan:MS Access 不支持 DISTINCT 聚合,请尝试 Jeremy C. 的答案
  • @Zoltan:你的 Access 版本是什么?
  • @Zoltan:好像 Access 需要 INNER 关键字 :-)
  • dnoeth -- Jeremy C 对内部连接的回答是有效的,但由于聚合,名称不是。你知道我怎样才能得到名字吗?
【解决方案3】:

在列名前使用表名

Select TableA.Name,TableB.Date from TableA, TableB where ID=ID_used;

【讨论】:

  • 这将如何解决原始问题?甚至不谈论使用旧式连接,不在 where 条件和其他问题中使用别名。
  • 我在编辑他的问题之前发布了我的建议。现在我的回答无关紧要,因为问题已经改变了..
  • 是的,他说得对,我的问题第一次就错了
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 2013-05-31
  • 1970-01-01
  • 2015-01-26
  • 2011-11-17
  • 1970-01-01
  • 2016-05-26
相关资源
最近更新 更多