Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并计数查询_Sql_Sql Server_Coldfusion_Count - Fatal编程技术网

Sql 合并计数查询

Sql 合并计数查询,sql,sql-server,coldfusion,count,Sql,Sql Server,Coldfusion,Count,我有一个页面,在那里我运行一个初始SQL查询来获取主题列表,然后我循环这个查询,并对从原始主题查询返回的每个记录运行两个额外的查询我碰巧在ColdFusion中这样做,但不确定这是否真的重要。这两个附加查询对特定主题进行计数,然后输出结果打印主题名称,然后打印该主题的两个计数。我试图提高此页面的性能,并想知道是否可以以某种方式将其合并到单个查询中 初始查询: SELECT subject_ID, subject_name FROM Subjects ORDER BY subject_

我有一个页面,在那里我运行一个初始SQL查询来获取主题列表,然后我循环这个查询,并对从原始主题查询返回的每个记录运行两个额外的查询我碰巧在ColdFusion中这样做,但不确定这是否真的重要。这两个附加查询对特定主题进行计数,然后输出结果打印主题名称,然后打印该主题的两个计数。我试图提高此页面的性能,并想知道是否可以以某种方式将其合并到单个查询中

初始查询:

SELECT subject_ID, subject_name FROM Subjects ORDER BY subject_name 初始查询循环内的查询:

SELECT COUNT(test_ID) as priority_count FROM Test_Queue WHERE priority_flag = 1 AND subject_ID = #SubjectQuery.subject_ID# SELECT COUNT(test_ID) as locked_count FROM Test_Queue WHERE locked = 1 AND subject_ID = #SubjectQuery.subject_ID# 关于如何对其进行优化的建议?DB是MS SQL 2008。谢谢

SELECT 
    subject_ID, 
    subject_name,
    priority_count = (select count(test_id) from test_queue where priority_flag = 1),
    locked_count = (select count(test_id) from test_queue where locked = 1)
FROM Subjects
ORDER BY subject_name
或者,如果计数应该包含主题id只是一个猜测,那么

SELECT 
    s.subject_ID, 
    s.subject_name,
    priority_count = (select count(test_id) from test_queue t where priority_flag = 1 and t.subject_id = s.subject_id),
    locked_count = (select count(test_id) from test_queue t where locked = 1 and t.subject_id = s.subject_id)
FROM Subjects s
ORDER BY subject_name
或者,如果计数应该包含主题id只是一个猜测,那么

SELECT 
    s.subject_ID, 
    s.subject_name,
    priority_count = (select count(test_id) from test_queue t where priority_flag = 1 and t.subject_id = s.subject_id),
    locked_count = (select count(test_id) from test_queue t where locked = 1 and t.subject_id = s.subject_id)
FROM Subjects s
ORDER BY subject_name

这应该可以做到,假设从subjects到test_队列的join列是正确的,您还没有指定test_队列中引用subjects的列

select
    subjects.subject_id
   ,subjects.subject_name
   ,sum(case when test_queue.priority_flag=1 THEN 1 ELSE 0 END) as priority_count
   ,sum(case when test_queue.locked=1 THEN 1 ELSE 0 END) as locked_count
  from
    subjects
    left join test_queue
       on subjects.subject_id=test_queue.subject_id
  group by subjects.subject_id, subjects.subject_name
  order by subjects.subject_name

这应该可以做到,假设从subjects到test_队列的join列是正确的,您还没有指定test_队列中引用subjects的列

select
    subjects.subject_id
   ,subjects.subject_name
   ,sum(case when test_queue.priority_flag=1 THEN 1 ELSE 0 END) as priority_count
   ,sum(case when test_queue.locked=1 THEN 1 ELSE 0 END) as locked_count
  from
    subjects
    left join test_queue
       on subjects.subject_id=test_queue.subject_id
  group by subjects.subject_id, subjects.subject_name
  order by subjects.subject_name

像这样的?如果priority_flag或locked属于SUM不喜欢的类型,则可能需要强制转换为INT

SELECT
  subject_ID
, subject_name
, SUM(priority_flag) AS priority_count
, SUM(locked) AS locked_count
FROM Subjects s, Test_Queue tq
GROUP BY subject_ID, subject_name
ORDER BY subject_name
;

像这样的?如果priority_flag或locked属于SUM不喜欢的类型,则可能需要强制转换为INT

SELECT
  subject_ID
, subject_name
, SUM(priority_flag) AS priority_count
, SUM(locked) AS locked_count
FROM Subjects s, Test_Queue tq
GROUP BY subject_ID, subject_name
ORDER BY subject_name
;

我要赌一把Test\u Queue.Subject\u ID=Subjects.Subject\u ID

SELECT s.subject_ID, s.subject_name, COUNT(t1.*) as priority_count, COUNT(t2.*) as locked_count
  FROM Subjects s
  LEFT OUTER JOIN Test_Queue t1
    ON s.Subject_ID = t1.Subject_ID
   AND t1.priority_flag = 1
  LEFT OUTER JOIN Test_Queue t2
    ON s.Subject_ID = t2.Subject_ID
   AND t2.locked = 1
 GROUP by s.subject_ID, s.subject_name
 ORDER BY s.subject_name

我要赌一把Test\u Queue.Subject\u ID=Subjects.Subject\u ID

SELECT s.subject_ID, s.subject_name, COUNT(t1.*) as priority_count, COUNT(t2.*) as locked_count
  FROM Subjects s
  LEFT OUTER JOIN Test_Queue t1
    ON s.Subject_ID = t1.Subject_ID
   AND t1.priority_flag = 1
  LEFT OUTER JOIN Test_Queue t2
    ON s.Subject_ID = t2.Subject_ID
   AND t2.locked = 1
 GROUP by s.subject_ID, s.subject_name
 ORDER BY s.subject_name

您是如何根据主题ID筛选测试队列的,此处未显示。在循环中的查询中,WHERE子句是否包含主题ID?抱歉,我删除了一些无关信息并意外删除了这些信息。我已经编辑了上面的查询。提高性能的第一个方法是按照前面的建议去掉循环。其次,将子查询的性能与CASE选项进行比较。有些数据库可能会更好地使用CASE。但是MS SQL可能也会表现得很好。如何根据主题ID筛选测试队列,此处未显示。在循环中的查询中,WHERE子句是否包含主题ID?抱歉,我删除了一些无关信息,并意外删除了这些信息。我已经编辑了上面的查询。提高性能的第一个方法是按照前面的建议去掉循环。其次,将子查询的性能与CASE选项进行比较。有些数据库可能会更好地使用CASE。但是MS SQL可能也会表现得很好。+1这是我在select中使用子查询的方法。我不得不说,我使用的格式作为输出变量。只是我的偏好,不应该有任何区别。+1这是我在select中使用子查询的路线。我不得不说,我使用的格式作为输出变量。只是我的偏好,不应该有任何区别。我喜欢你使用的group by vs distinct…顺便问一下,为什么每个人都以不同的样式/格式编写sql代码?只是好奇:我喜欢你的使用组vs distinct…顺便问一下,为什么每个人都以不同的风格/格式编写sql代码?只是好奇: