2016-08-03 20 views
0

我的表上有以下记录。我想根据主密钥将这些记录转换成一行。根据主密钥将多个行转换为一个行

records:- 
id  date  userkey workinghours masterkey 
1941 2016-06-01 1   6   NULL 
1946 2016-06-08 1   1   NULL 
1947 2016-06-09 1   6   1946 
1948 2016-06-10 1   3   1946 

我想要这样的输出。

id  startdate endate  userkey workinghours masterkey 
1941 2016-06-01 2016-06-01 1  6   NULL 
1946 2016-06-08 2016-06-10 1  10   1946 

我该怎么做?作为新手,我需要您的帮助来撰写此查询。

+5

凭什么请问'workinghours'输出得到值6,10 – jonju

+1

和1946年id如何在输出中获得masterkey 1946,而在样本数据中,masterkey是否为null? –

+0

当记录有组密钥我想总结工作时间@jonju –

回答

2

这里是一个办法做到这一点,利用ISNULLGROUP BY

创建和填充示例表(保存我们这一步在你未来的问题)

DECLARE @T as TABLE 
(
    id int, 
    [date] date, 
    userkey int, 
    workinghours int, 
    masterkey int 
) 

INSERT INTO @T VALUES 
(1941, '2016-06-01', 1, 6, NULL), 
(1946, '2016-06-08', 1, 1, NULL), 
(1947, '2016-06-09', 1, 6, 1946), 
(1948, '2016-06-10', 1, 3, 1946) 

查询:

SELECT ISNULL(MasterKey, id) as id, 
     MIN([date]) as startdate, 
     MAX([date]) as enddate, 
     userkey, 
     SUM(workinghours) as workinghours, 
     MIN(masterKey) as masterKey 
FROM @T 
GROUP BY ISNULL(MasterKey, id), userkey 

结果:

id   startdate enddate userkey  workinghours masterKey 
----------- ---------- ---------- ----------- ------------ ----------- 
1941  2016-06-01 2016-06-01 1   6   NULL 
1946  2016-06-08 2016-06-10 1   10   1946 
+0

更好的和更优雅的方式与'ISNULL'都已经在一个选择 –

+0

@GiladGreen谢谢! –

+0

这是不正确的,因为第一个记录的结束日期应该是'2016-06-01' – Ket

0

试试这个

DECLARE @T as TABLE 
(
    id int, 
    [date] date, 
    userkey int, 
    workinghours int, 
    masterkey int 
) 

INSERT INTO @T VALUES 
(1941, '2016-06-01', 1, 6, NULL), 
(1946, '2016-06-08', 1, 1, NULL), 
(1947, '2016-06-09', 1, 6, 1946), 
(1948, '2016-06-10', 1, 3, 1946) 


SELECT 
    MIN(ISNULL(masterkey,id)) as Id, 
    MIN([date]) as StartDate, 
    MAX([date]) as EndDate, 
    min(userkey) As Userkey, 
    sum(workinghours) As WorkingHours, 
    MIN(MasterKey) AS MasterKey 
FROM 
(
    SELECT 
     id , 
     date , 
     userkey , 
     workinghours , 
     masterkey, 
     ISNULL(masterkey, id) TmpMasterkey 
    FROM @T  
) A 
GROUP BY TmpMasterkey 

输出

Id  StartDate EndDate  Userkey WorkingHours MasterKey 
1941 2016-06-01 2016-06-01 1  6    NULL 
1946 2016-06-08 2016-06-10 1  10    1946 
0

这应该工作:

create table #tbl 
(id  INT 
, dt date   
, userkey INT 
, workinghours INT 
, masterkey INT 
) 

INSERT INTO #tbl VALUES 
(1941 ,'2016-06-01' , 1   ,6   ,NULL) 
,(1946 ,'2016-06-08' ,1   ,1   ,NULL) 
,(1947 ,'2016-06-09' ,1   ,6   ,1946) 
,(1948 ,'2016-06-10' ,1   ,3   ,1946) 

WITH WORKHOURS_CTE (
    ID 
    ,origdate 
    ,userkey 
    ,workinghours 
    ,masterkey 
    ) 
AS 
    -- Define the CTE query. 
    (
    SELECT CASE WHEN masterkey IS NULL THEN id ELSE masterkey END AS ID 
     ,dt 
     ,userkey 
     ,workinghours 
     ,masterkey 
    FROM #tbl 
    ) 
-- Define the outer query referencing the CTE name. 
SELECT ID 
    ,MIN(origdate) AS STARTDATE 
    ,MAX(origdate) AS ENDDATE 
    ,SUM(workinghours) AS workinghours 
    ,userkey 
    ,MAX(masterkey) AS masterkey 
FROM WORKHOURS_CTE 
GROUP BY ID 
    ,userkey;