Sql 按特定月份和用户按月份天数透视[转换]表

Sql 按特定月份和用户按月份天数透视[转换]表,sql,sql-server,pivot,transform,Sql,Sql Server,Pivot,Transform,我有两个名为Records和Users的表。桌子的设计如下所示 表[记录] Id、用户名、IP、日期 穆拉特,192.168.1.1002019-02-1704:12:20.470 穆拉特,192.168.1.1002019-02-1704:33:36.120 迈克尔,192.168.120.1752019-02-17 08:08:22.210 用户[用户] 用户名、姓名、邮件、部门、记录、职能、级别、经理、经理 穆拉特,穆拉特,murat@asd.com,11111,IT,软件部,1号,神户,

我有两个名为Records和Users的表。桌子的设计如下所示

表[记录] Id、用户名、IP、日期 穆拉特,192.168.1.1002019-02-1704:12:20.470 穆拉特,192.168.1.1002019-02-1704:33:36.120 迈克尔,192.168.120.1752019-02-17 08:08:22.210

用户[用户] 用户名、姓名、邮件、部门、记录、职能、级别、经理、经理 穆拉特,穆拉特,murat@asd.com,11111,IT,软件部,1号,神户,迈克尔 迈克尔,迈克尔,michael@asd.com,22222,IT,帮助台,2号,沙克,迈克尔

我想做的是,根据具体月份和用户名,按月份的天数透视[记录]表

我想要的是这样的东西: 用户名、姓名、经理职务、经理、月份、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、30、31 穆拉特,穆拉特,迈克尔,科比,二月,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不

感谢您的支持

一个支点确实可以用于此

并且用户表可以连接到枢轴

SELECT 
pvt.Username, 
usr.Name,
usr.ManagerTop, 
usr.Manager,
pvt.[Month], 
IIF([1]>0,'Yes','No') AS [1],
IIF([2]>0,'Yes','No') AS [2],
-- Add the other days
IIF([17]>0,'Yes','No') AS [17],
-- Add the other days
IIF([30]>0,'Yes','No') AS [30],
IIF([31]>0,'Yes','No') AS [31]
FROM
(
   SELECT
   rec.Username,  
   YEAR(rec.[Date]) AS [Year],
   DATENAME(month, rec.[Date]) AS [Month],
   DAY(rec.[Date]) AS [Day]
   FROM [Records] rec
   WHERE rec.[Date] >= DATEFROMPARTS(YEAR(GetDate()), 1, 1)
) src
PIVOT 
(
  COUNT([Day])
  FOR [Day] IN (
     [1],[2],[3],[4],[5],[6],[7],[8],
     [9],[10],[11],[12],[13],[14],[15],[16],
     [17],[18],[19],[20],[21],[22],[23],[24],
     [25],[26],[27],[28],[29],[30],[31])
) pvt
LEFT JOIN [Users] usr 
     ON usr.Username = pvt.Username
ORDER BY pvt.Username;

在rextester上进行测试

您可以使用Pivot实现这一点,为此您需要使用CTE生成所需的月份和天数。我编写的查询假设您的日期在一年边界内,如果您想扩展到多个年份,您可以通过在最小日期和最大日期之间生成年份来轻松完成

declare @table1 table(Id int, Username varchar(100), IP varchar(20), [Date] datetime)
insert into @table1 select 1, 'murat'   , '192.168.1.100', '2019-02-17 04:12:20.470'
insert into @table1 select 2, 'murat'   , '192.168.1.100', '2019-02-17 04:33:36.120'
insert into @table1 select 3, 'michael', '192.168.120.175', '2019-02-17 08:08:22.210'

declare @table2 table( Username varchar(100), Name varchar(100), Mail varchar(100), Department varchar(100), Record varchar(100), [Function] varchar(100), [Level] int , Manager varchar(100), ManagerTop varchar(100))
insert into @table2 select 'murat', 'Murat', 'murat@asd.com', '11111', 'IT', 'Software Department', 1, 'Kobe', 'Michael'
insert into @table2 select 'michael', 'Michael', 'michael@asd.com', '22222', 'IT', 'Helpdesk', 2, 'Shaq', 'Michael'

;WITH cte(months) 
     AS (SELECT 1 
         UNION ALL 
         SELECT months + 1 
         FROM   cte 
         WHERE  months < 31), 
     n(n) 
     AS (SELECT 1 
         UNION ALL 
         SELECT n + 1 
         FROM   n 
         WHERE  n < 31), 
     cte2 
     AS (SELECT C.months AS CM, 
                n.n      AS CD 
         FROM   cte C 
                CROSS JOIN n), 
     cte3 
     AS (SELECT username, 
                NAME, 
                managertop, 
                mname, 
                t2.[date], 
                C2.cd, 
                CASE 
                  WHEN Month(date) = C2.cm 
                       AND Day(date) = cd THEN 'Yes' 
                  ELSE 'No' 
                END Present, 
                rn 
         FROM   cte2 C2 
                INNER JOIN (SELECT [date], 
                                   T1.username, 
                                   T2.NAME, 
                                   T2.managertop, 
                                   Datename(month, Dateadd(month, Month([date]),0)- 1) 
                                   Mname, 
                                   Row_number() 
                                     OVER ( 
                                       partition BY T1.username 
                                       ORDER BY T1.date) 
                                   RN 
                            FROM   @table1 T1 
                                   INNER JOIN @table2 T2 
                                           ON T1.username = T2.username)T2 
                        ON Month(t2.date) = C2.cm) 
SELECT username, 
       NAME, 
       managertop, 
       mname AS [Month], 
       [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]
FROM   (SELECT * 
        FROM   cte3 
        WHERE  rn = 1) AS SourceTable 
       PIVOT ( Max(present) 
             FOR cd IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]) ) AS pivottable; 

如果您对代码和数据进行格式化,使其可读,您的读者将不胜感激。通过在行中添加四个或更多空格将行格式化为代码。您能告诉我们您为实现目标做了哪些尝试,和/或您为实现目标完成的研究吗?如果你做了研究,你不明白的是什么?也许我们可以帮助您解释一下您遇到问题的部分。Thx。顺便说一句,我忘了包括usr.Name。此方法需要添加所有31天,但只需向SQL中添加一次。
+----------+---------+------------+----------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+-----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| username | NAME    | managertop | Month    | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17  | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
+----------+---------+------------+----------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+-----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| michael  | Michael | Michael    | February | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
+----------+---------+------------+----------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+-----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| murat    | Murat   | Michael    | February | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
+----------+---------+------------+----------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+-----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+