【问题标题】:Find the "Project" Count for particular "User" for different days of interval查找不同天数的特定“用户”的“项目”计数
【发布时间】:2015-06-29 14:13:01
【问题描述】:
user_table
........................................
| user_id   |  user_name  |  password  |
""""""""""""""""""""""""""""""""""""""""

project_table
..............................................
|  Project_id  |  user_id  |  Date_assigned  |
''''''''''''''''''''''''''''''''''''''''''''''

我有两张表,一张是User_table,另一张是Project_table! 我需要从这两个表中生成报告!

要求的输出是:

..................................................................
|  user_name |   0 - 10 Days  |   10 - 20 days |  20 - 30 days   |
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

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

这是我尝试的 SQL 查询:

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  |
  '''''''''''''''''''''''''''''''''''

我无法找到其他两列的计数! 谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    你在正确的轨道上。既然你知道如何创建

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

    我相信你也可以创建

    --------------------------------
    | user_name | Project_10_to_20 | 
    --------------------------------
    

    --------------------------------
    | user_name | Project_20_to_30 | 
    --------------------------------
    

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

    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
    

    FULL OUTER JOIN 确保列出所有用户,即使他们只出现在 A、B 或 C 之一中。COALESCE 确保 0 显示在未在 A、B 之一中列出的用户的相应列中和 C.

    【讨论】:

      【解决方案2】:

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

      -- 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
      

      【讨论】:

      • +1。我的解决方案更通用(用于组合不同信息的列),但您的解决方案更适合当前的问题。
      • 感谢我最初尝试使用 pivot 的想法,但后来我意识到这对于这个简单的任务来说太复杂了。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多