Sql 找到;项目“;“计算特定的”;“用户”;在不同的时间间隔

Sql 找到;项目“;“计算特定的”;“用户”;在不同的时间间隔,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个表,一个是用户表,另一个是项目表! 我需要从这两个表生成报告 所需输出为: user_table ........................................ | user_id | user_name | password | """""""""""""""""""""""""""""""""""""""" project_table .............................................. | Project_i

我有两个表,一个是用户表,另一个是项目表! 我需要从这两个表生成报告

所需输出为:

user_table
........................................
| user_id   |  user_name  |  password  |
""""""""""""""""""""""""""""""""""""""""

project_table
..............................................
|  Project_id  |  user_id  |  Date_assigned  |
''''''''''''''''''''''''''''''''''''''''''''''
输出表包含过去0到10天分配给特定用户的项目数! 另一列包含从当天起10到20天内分配的项目计数。 最后一列包含从当天起20到30天内分配的项目数

这是我尝试的SQL查询:

..................................................................
|  user_name |   0 - 10 Days  |   10 - 20 days |  20 - 30 days   |
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
这将以这种格式提供输出

select 
User_table.User_Name, COUNT(1)Project_0_to_10 
from user_table
INNER join Project_table as tb_project on tb_project.DateAssigned 
between  DATEADD(DD,-10,GETDATE()) and DATEADD(DD,0,GETDATE()) and
tb_project.user_id=User_table.User_id
group by user_table.user_name
我找不到其他两列的计数!
谢谢大家!

你在正确的轨道上。因为你知道如何创造

  ...................................
  |  user_name  |  Project_0_to_10  |
  '''''''''''''''''''''''''''''''''''
我相信您也可以创建

-------------------------------
| user_name | Project_0_to_10 | 
-------------------------------

对吧??让我们将这些SQL称为A、B和C。现在您需要做的就是将它们组合起来:


完全外部联接确保列出所有用户,即使它们仅出现在A、B或C中的一个中。COALESCE确保未在A、B和C中列出的用户的相应列中显示
0

例如,您可以使用条件计数。这可以这样实现:

WITH 
  A AS (/* your A SQL here */),
  B AS (/* your B SQL here */),
  C AS (/* your C SQL here */)
SELECT COALESCE(a.user_name, b.user_name, c.user_name)
     , COALESCE(A.Project_0_to_10, 0)
     , COALESCE(B.Project_10_to_20, 0)
     , COALESCE(C.Project_20_to_30, 0)
  FROM A
       FULL OUTER JOIN B ON A.user_name = B.user_name
       FULL OUTER JOIN C ON B.user_name = C.user_name

+1.我的解决方案更一般(用于组合不同信息的列),但对于当前的问题,您的解决方案要优雅得多。多亏了第一个想法,我尝试使用pivot,但后来我意识到这对于这个简单的任务来说太复杂了。:-)
--------------------------------
| user_name | Project_20_to_30 | 
--------------------------------
WITH 
  A AS (/* your A SQL here */),
  B AS (/* your B SQL here */),
  C AS (/* your C SQL here */)
SELECT COALESCE(a.user_name, b.user_name, c.user_name)
     , COALESCE(A.Project_0_to_10, 0)
     , COALESCE(B.Project_10_to_20, 0)
     , COALESCE(C.Project_20_to_30, 0)
  FROM A
       FULL OUTER JOIN B ON A.user_name = B.user_name
       FULL OUTER JOIN C ON B.user_name = C.user_name
-- Create demo data
CREATE TABLE #user(user_id int identity(1,1), user_name nvarchar(50))

INSERT INTO #user(user_name) VALUES(N'A'),(N'B')

CREATE TABLE #projects(project_id int, user_id int, date_assigned datetime)

INSERT INTO #projects(project_id, user_id, date_assigned)
VALUES  (1,1,GETDATE()),(1,2,DATEADD(Day,-11,GETDATE())), (2,2,DATEADD(day,-11,GETDATE())), (3,2,DATEADD(day,-21,GETDATE())),
        (2,1,DATEADD(day,-21,GETDATE())),(3,1,DATEADD(day,-21,GETDATE()))

-- your part
SELECT u.user_name, 
    SUM(CASE WHEN p.date_assigned BETWEEN DATEADD(day,-10,GETDATE()) AND GETDATE() THEN 1 ELSE 0 END) last_10_days,
    SUM(CASE WHEN p.date_assigned BETWEEN DATEADD(day,-20,GETDATE()) AND DATEADD(day,-11,GETDATE()) THEN 1 ELSE 0 END) last_20_days,
    SUM(CASE WHEN p.date_assigned BETWEEN DATEADD(day,-30,GETDATE()) AND DATEADD(day,-21,GETDATE()) THEN 1 ELSE 0 END) last_30_days
FROM #user as u
INNER JOIN #projects as p
        ON u.user_id = p.user_id
GROUP BY u.user_name

-- cleanup
DROP TABLE #projects
DROP TABLE #user