Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 server的列和最新状态显示计数_Sql_Sql Server - Fatal编程技术网

如何根据SQL server的列和最新状态显示计数

如何根据SQL server的列和最新状态显示计数,sql,sql-server,Sql,Sql Server,我点了一张这样的桌子 ID | name | status | Year _______________________________________ 1 |f1 car | enter |2017 2 |f2 car | checking |2019 3 |f3 car | enter |2017 4 |f2 car | enter |2018 5 |f3 car | checking |2019

我点了一张这样的桌子

   ID | name    | status |   Year
_______________________________________ 
    1  |f1 car  | enter    |2017
    2  |f2 car  | checking |2019
    3  |f3 car  | enter    |2017
    4  |f2 car  | enter    |2018
    5  |f3 car  | checking |2019
    6  |f2 car  | exit     |2020
    7  |f3 car  | exit     |2020
    8  |f1 car  | checking |2018
    9  |f4 car  | enter    |2019
   10  |f5 car  |enter     |2019
   11  |f4 car  |checking  |2020
    
有三件事
name、status和year
我希望它能够根据年份和汽车数量获得最新的状态统计

“输入”
是每辆车的第一个状态,意味着如果表中有一辆车,第一个状态将是
enter

然后检查然后
像这样我想在查询后得到什么

enter | checking | exit
_______________________
 1    |2         | 2  
这是最近一年的智能汽车计数状态

如何在SQL中实现这一点

我的解决方法是首先获得状态为“回车”的车辆列表。 现在我有5辆车的名字,我把它放在一个
temp表中

现在我将遍历
temp table
并按名称在order表中搜索,根据年份选择最后一个状态并将其放入表中

然后,在临时表的第二行,我将选择一个汽车名称,并在订单表上迭代,得到第二行汽车的最后状态


请告诉我还可以做些什么

您可以使用
行号()
和聚合。如果您对单独的行而不是列中的结果感到满意,这很简单:

select status, count(*)
from (select t.*,
             row_number() over (partition by name order by year desc) as seqnum
      from orders t
     ) t
where seqnum = 1
group by status;

查询可能如下所示:

选择DISTINCT
名称
第一行上的第一个值(ID)(按名称划分,按年份ASC排序,ID ASC),
总行数(按名称划分)上的计数(ID),
MIN(状态为'enter'然后为年底时的情况)超过(按名称划分)进入年,
在(按名称划分的分区)检查计数上求和(状态为“检查”然后为1结束时的情况),
超过(按名称划分)退出年的最大值(状态为“退出”然后为年底时的情况)
从汽车;
您可以通过创建相应的参数表达式和窗口定义来添加任何其他列


或者也许你需要简单的

WITH
cte AS ( SELECT DISTINCT name,
                         FIRST_VALUE(status) OVER (PARTITION BY name ORDER BY Year DESC, ID DESC) status
         FROM cars )
SELECT SUM(CASE WHEN status = 'enter' THEN 1 ELSE 0 END) enter,
       SUM(CASE WHEN status = 'checking' THEN 1 ELSE 0 END) checking,
       SUM(CASE WHEN status = 'exit' THEN 1 ELSE 0 END) [exit]
FROM cte
?


为什么要使用不受支持的SQL Server版本?MySQL SQL Server和SQL Server 2008完全不受支持。您实际使用的是什么(为什么没有升级)?我使用的是sql server 2019Use
FIRST\u VALUE()
window函数。像这样,我希望在查询后获得的内容不要发布“like”-样本输出必须与显示的样本数据完全匹配。如果使用了一些其他参数值,则必须指定它们。我已将其替换,但列前缀“t”仍然与查询中使用的表名或别名不匹配。我无法在此查询中的所有位置将t替换为我的表,因为在it@fatboy . . . 我更新了答案。但是你应该知道什么是表别名。这是另外一回事@akina这不是我要找的for@fatboy这不是我想要的,如果你想得到“你想要的”,那么你必须给出额外的解释。正如我在对问题的评论中所说的,示例输出必须与所显示的示例数据完全匹配。最好的方法是解释输出中的每个单独值是如何从显示的样本源数据中获得的。好的,让我来解释一下,一辆进入车库的汽车,它的寿命有三种状态,当它进入时状态为进入,当它被检查时状态为检查,当它退出时状态为退出,因此,随着时间的推移,每辆车的第一个状态都是进入,然后变为检查和退出