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