列,计数数据列,不希望的结果?

时间:2016-07-14 00:31:00

标签: sql sql-server

我在计算SQL Server中出现的特定列数据。

标准是通过分配给该工作人员的唯一编号获取工作人员数据。计数需要在两个日期之间。

这是我到目前为止所拥有的, 我正在计算值#include <stdio.h> int main() { int x; /* A normal integer*/ int *p; /* A pointer to an integer ("*p" is an integer, so p must be a pointer to an integer) */ p = &x; /* Read it, "assign the address of x to p" */ scanf( "%d", &x ); /* Put a value in x, we could also use p here */ printf( "%d\n", *p ); /* Note the use of the * to get the value */ getchar(); } 以及列号p = &x;中的Data_1Info_Data来自BETWEEN '2016/6/15' AND '2016/7/16'Staff_No的次数3201

SELECT S.Staff_No, S.Info_Data, C.cCount
  FROM Staff_Manager.dbo.Staff_Time_TBL  S 
       INNER JOIN (SELECT Info_Data, count('Data_1') as cCount
                     FROM Staff_Manager.dbo.Staff_Time_TBL  
                    GROUP BY Info_Data) C ON S.Info_Data = C.Info_Data 
                    WHERE Staff_No = 3201 AND Date_Data BETWEEN '2016/6/15' AND '2016/7/16'

结果不是我期望的结果,如下所示。 Data_1在这两个日期之间发生了9次。

No  |  Staff_No  |  Info_Data  |  cCount   
1   |  3201      |  Data_1     |  3456  
2   |  3201      |  Data_1     |  3456  
3   |  3201      |  Data_1     |  3456  
4   |  3201      |  Data_1     |  3456  
5   |  3201      |  Data_1     |  3456  
6   |  3201      |  Data_1     |  3456  
7   |  3201      |  Data_1     |  3456  
8   |  3201      |  Data_1     |  3456  
9   |  3201      |  Data_1     |  3456 

因此,它似乎计算了Data_1列中cCount的所有出现次数并重复9次行。它应该如下所示。

No  |  Staff_No  |  Info_Data  |  cCount  
1   |  3201      |  Data_1     |  9

如何修改SQL以获得所需的结果?我猜我有WHERE在错误的地方,但我无法得到任何其他工作?

1 个答案:

答案 0 :(得分:1)

嗯,要获得所需的结果,您只需要使用group by语句进行常规计数。

SELECT Staff_No, Info_Data, COUNT(*) cCount
FROM Staff_Manager.dbo.Staff_Time_TBL
WHERE Staff_No = 3201 
AND Date_Data BETWEEN '2016/6/15' AND '2016/7/16'
GROUP BY Staff_No, Info_Data;

您的查询实际上做的是将每次出现的时间作为单独的行,然后显示您的Staff_Time_TBL中所有出现的Info_Data(&#39; Data_1&#39;)的计数(不关心date,因为日期不是连接中子查询的一部分。