2012-08-14 63 views
0

我已经产生了查询,从我的源数据列出了一些记录(在此底部)试图计算合计结果在SQL Server 2008 R2

我的表的设置是由3个表,看起来的像

tu_unit_tbl

| unit_id | unit_name | unit_subject | 

sp_student_tbl

| st_id | st_fname | st_lname | 

sp_test_tbl

| ts_id | ts_st_id | ts_unit_id | ts_session | 

我的查询到目前为止,工作正常,到目前为止,但我需要一个计算字段添加到它:

SELECT U.unit_subject, 
     U.unit_name, 
     S.st_fname + ' ' + S.st_lname as sname, 
     T.ts_st_id, 
     T.ts_session 
FROM sp_test_tbl T 
JOIN sp_student_tbl S on T.ts_st_id = st_id 
JOIN tu_unit_tbl U on unit_id = ts_unit_id 

WHERE ts_st_id = 184318 
GROUP BY unit_name, U.unit_subject, ts_session, st_lname, st_fname, ts_st_id 

它产生这样的:

如果您注意到,有3行。前两个具有相同的“单位名称”。我期待添加一个字段来计算这些行

unit_subject | unit_name       | sname | ts_st_id | ts_session 
-------------------------------------- 
Mathematics | Algebra, Patterns, and Relationships | Frog Man | 184318 | 2012-07-31 15:22:42.000 
Mathematics | Algebra, Patterns, and Relationships | Frog Man | 184318 | 2012-07-31 15:25:47.000 
Mathematics | Data, Statistics, and Probability | Frog Man | 184318 | 2012-07-31 15:25:59.000 

的发生什么,我试图让

unit_subject | unit_name       | sname | **COUNT OF UNIT_NAME** 
--------------------------------------------------------------------------------------- 
Mathematics | Algebra, Patterns, and Relationships | Frog Man | **2** 
Mathematics | Data, Statistics, and Probability | Frog Man | **1** 

注意,只有2个记录现在,因为第2人合并和计数..

这是一个合计的结果,当然,我想要计算一个新字段中的这些聚合项(称为计数单位名称)

我试图在计数(*)字段中输入一个子查询,该子查询试图对字段进行计数不会给我一个聚合数,而是统计我聚合的每个项目!

如何计算我的结果中重复的单位名称

这里的原始数据:(重复数据表明一个学生一个测试会话中的每个记录是一个会话的一部分。)

select ts_st_id, 
     ts_session 
from sp_test_tbl 
where ts_st_id = 184318 

ts_st_id | ts_session

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15时22分42秒。000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:22:42.000

184318 2012-07-31 15:25:47.000

184318 2012-07-31 15:25:47.000

184318 2012- 07-31 15:25:47.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15: 25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012- 07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15: 25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59.000

184318 2012-07-31 15:25:59。000

我最近的尝试(由praveen推荐)似乎可能工作,但给出了一个错误。

WITH CTE (unit_subject, 
     unitName, 
     sname, 
     ts_st_id, 
     ts_session) 
AS 
(
    SELECT U.unit_subject, 
     U.unit_name as unitName, 
     S.st_fname + ' ' + S.st_lname as sname, 
     T.ts_st_id, 
     T.ts_session 
    FROM sp_test_tbl T 
    JOIN sp_student_tbl S on T.ts_st_id = st_id 
    JOIN tu_unit_tbl U on unit_id = ts_unit_id 

    WHERE ts_st_id = 1234 
    GROUP BY unit_name, U.unit_subject, ts_session, st_lname, st_fname, ts_st_id 
) 

select count(unitName) over (partition by unit_name) 

Go 

生成以下错误消息:

Msg 207, Level 16, State 1, Line 22 
Invalid column name 'unit_name'. 
Msg 207, Level 16, State 1, Line 22 
Invalid column name 'unitName'. 
+0

您对COUNT(*)的查询是怎样的? – 2012-08-14 01:39:04

+0

我不在我的办公桌前,但是如果我用count(*)包围查询,第一个查询的计数是13,3和21,第二个查询的计数是16和21。它明确*源*数据项正在计算,而不是*单位*在我的聚合结果 – KevinDeus 2012-08-14 01:45:12

+0

将您的查询放入一个CTE,然后选择count(unitName)over(由unitName分区) – praveen 2012-08-14 01:52:55

回答

0

使用公共表表达式做到了。谢谢praveen

WITH CTE 
    AS 
    (
     SELECT 
      U.unit_subject, 
      U.unit_name, 
      S.st_fname + ' ' + S.st_lname as sname, 
      T.ts_st_id, 
      st_grade, 
      T.ts_session 
     FROM sp_test_tbl T 
     JOIN sp_student_tbl S on T.ts_st_id = st_id 
     JOIN tu_unit_tbl U on unit_id = ts_unit_id 

     WHERE ts_st_id = 1234 
     GROUP BY unit_name, U.unit_subject, ts_session, st_lname, st_fname, ts_st_id, st_grade 
    ) 

    select distinct unit_subject, unit_name, sname, ts_st_id, st_grade, count(unit_name) over (partition by unit_name) as TestSessions 
    from CTE