Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 - Fatal编程技术网

减少SQL查询中的行数和可读性

减少SQL查询中的行数和可读性,sql,sql-server,Sql,Sql Server,我有两张桌子: 清单a: ID Date pg 23 2016-11-30 sub 23 2016-12-03 sub 23 2016-12-04 sub 23 2016-12-05 sub 69 2017-07-21 Closed 69 2017-07-22 Closed 69 2017-07-23 Closed 92 2016-11-29 sub 92 2016-11-30 sub 46 2017-01-11 In 46 2017-01-12

我有两张桌子:

清单a:

 ID  Date  pg

23  2016-11-30  sub
23  2016-12-03  sub
23  2016-12-04  sub
23  2016-12-05  sub
69  2017-07-21  Closed
69  2017-07-22  Closed
69  2017-07-23  Closed
92  2016-11-29  sub
92  2016-11-30  sub
46  2017-01-11  In
46  2017-01-12  In
46  2017-01-13  In
清单b:

ID  Name

23  B
46  B
69  X
92  B
我的任务是编写一个sql查询,这样我就可以得到名为“B”的每个日期的计数,并且计数应该大于4

到目前为止,我已经编写了以下查询,它为我提供了输出:

SELECT date, count(Name) as CountName FROM
(
SELECT list_b.ID as Id,list_b.Name as Name,Date from list_b
inner JOIN list_a
on list_b.ID=list_a.ID
) t
where Name='B'
group by Date
Having count(Name)>4
order by count(Name) desc;
我正试图使我的查询更具可读性,更简洁。 有没有更好的方法可以解决这个问题


注意:以上表格是原始表格的片段

不幸的是,您不能在mysql中使用CTE with子句,但您可以创建临时表:

CREATE TEMPORARY TABLE IF NOT EXISTS t AS (
    SELECT list_b.ID AS Id,list_b.Name AS Name,Date
   FROM list_b
   INNER JOIN list_a ON list_b.ID=list_a.ID
);

SELECT date, count(Name) AS CountName
FROM t
WHERE Name='B'
GROUP BY Date HAVING count(Name)>4
ORDER BY count(Name) DESC;

您有一个不必要的备用子查询。另外,在名为t_databaseassociation的表上使用别名而不是表名也是个人的偏好。这确实会产生很大的不同

试一试


您的查询将对您的数据产生空结果。@PHPNinja否,OP不需要枚举记录。临时表过多。我编辑了我的答案,您说得很对,group by 1将无法在sql server中工作。请参阅-@LJ01分组依据1是否有效???是的,可以使用输出中字段的位置号代替GROUP BY和ORDER BY子句中的名称/表达式。这在sql server中有效吗?我的巴迪并不是想说这是无效的,只是我的一个新把戏。。。当我下一个站在一辆汽车前面时,我会试试的pc@Akina . . . 位置字段号的使用是ORDER BY标准的一部分,尽管我认为这是不推荐的。它不是GROUP BY的标准SQL,也不支持列别名。有些数据库扩展SQL以允许它们。自然联接是一种讨厌的做法,因为它没有考虑正确声明的外键引用。我强烈建议你不要使用它。
SELECT `Date`, COUNT(Name) as CountName
FROM list_a
NATURAL JOIN list_b
WHERE Name = 'B'
GROUP BY `Date`
HAVING COUNT(Name) > 4
ORDER BY CountName DESC;
SELECT 
    list_b.Date AS date,
    count(Name) AS CountName
FROM list_b
INNER JOIN list_a ON list_b.ID=list_a.ID
WHERE list_b.Name = 'B'
GROUP BY list_b.Date HAVING count(list_b.Name) > 4
ORDER BY count(Name) DESC
SELECT date, count(name) as countname 
 from list_b b
  inner JOIN list_a a on b.ID= a.ID
 where Name='B'
  group by Date
   Having count(Name)>4
    order by count(Name) desc;