我在计算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_1
,Info_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
在错误的地方,但我无法得到任何其他工作?
答案 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,因为日期不是连接中子查询的一部分。