SQL如何将多行数据合并成一行显示

时间:2022-11-23 15:05:15
工作时间表:
人员ID   日期   工作时间
  1       8/1      8
  1       8/2      8
  1       8/3      8
  1       8/4      8
  1       8/5      8
  1       8/6      8
  1       8/7      8
员工表:
ID   姓名
1     张三

显示成:
人员ID  工作时间1 工作时间2 工作时间3 工作时间4 工作时间5 工作时间6 工作时间7
 张三       8         8         8         8          8         8         8

5 个解决方案

#1


 select ID,  
  sum(case 日期 when '8/1' then 工作时间else 0 end) as DAY1,  
  sum(case 日期 when '8/2' then 工作时间else 0 end) as DAY2 , 
  sum(case 日期 when '8/3' then 工作时间else 0 end) as DAY3,
  sum(case 日期 when '8/4' then 工作时间else 0 end) as DAY4, 
  sum(case 日期 when '8/5' then 工作时间else 0 end) as DAY5,  
  sum(case 日期 when '8/6' then 工作时间else 0 end) as DAY6,  
  sum(case 日期 when '8/7' then 工作时间 else 0 end) as DAY7  
from SC1 group by ID 

ID          DAY1        DAY2        DAY3        DAY4        DAY5        DAY6        DAY7
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1           8           8           8           8           8           8           8

(1 row(s) affected)


2005以后可以用PIVOT

#2


--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO 
CREATE TABLE [ta]([人员ID] INT,[日期] VARCHAR(3),[工作时间] INT)
INSERT [ta]
SELECT 1,'8/1',8 UNION ALL
SELECT 1,'8/2',8 UNION ALL
SELECT 1,'8/3',8 UNION ALL
SELECT 1,'8/4',8 UNION ALL
SELECT 1,'8/5',8 UNION ALL
SELECT 1,'8/6',8 UNION ALL
SELECT 1,'8/7',8
--------------开始查询--------------------------

--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([ID] INT,[姓名] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三'
--------------开始查询--------------------------
DECLARE @sql VARCHAR(max)
SELECT @sql=ISNULL(@sql+',','')+QUOTENAME([日期]) FROM [ta] 
GROUP BY [日期]
EXEC('
SELECT * FROM 
(
SELECT [姓名], [工作时间],[日期] FROM [ta] LEFT JOIN [tb] ON ta.[人员ID]=tb.id
) a
PIVOT(MAX([工作时间]) FOR [日期] IN ('+@sql+')) pit')
/*
姓名 8/1 8/2 8/3 8/4 8/5 8/6 8/7
张三 8 8 8 8 8 8 8
*/

#3


检查   @@servername   和   serverproperty( 'servername ')   是否一致

#4


引用 3 楼  的回复:
检查   @@servername   和   serverproperty( 'servername ')   是否一致

发错地方了 不好意思

#5


如果我现在要查8月一号到8月5号之间的,其他天数的不要该怎么写?

#1


 select ID,  
  sum(case 日期 when '8/1' then 工作时间else 0 end) as DAY1,  
  sum(case 日期 when '8/2' then 工作时间else 0 end) as DAY2 , 
  sum(case 日期 when '8/3' then 工作时间else 0 end) as DAY3,
  sum(case 日期 when '8/4' then 工作时间else 0 end) as DAY4, 
  sum(case 日期 when '8/5' then 工作时间else 0 end) as DAY5,  
  sum(case 日期 when '8/6' then 工作时间else 0 end) as DAY6,  
  sum(case 日期 when '8/7' then 工作时间 else 0 end) as DAY7  
from SC1 group by ID 

ID          DAY1        DAY2        DAY3        DAY4        DAY5        DAY6        DAY7
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1           8           8           8           8           8           8           8

(1 row(s) affected)


2005以后可以用PIVOT

#2


--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO 
CREATE TABLE [ta]([人员ID] INT,[日期] VARCHAR(3),[工作时间] INT)
INSERT [ta]
SELECT 1,'8/1',8 UNION ALL
SELECT 1,'8/2',8 UNION ALL
SELECT 1,'8/3',8 UNION ALL
SELECT 1,'8/4',8 UNION ALL
SELECT 1,'8/5',8 UNION ALL
SELECT 1,'8/6',8 UNION ALL
SELECT 1,'8/7',8
--------------开始查询--------------------------

--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([ID] INT,[姓名] VARCHAR(4))
INSERT [tb]
SELECT 1,'张三'
--------------开始查询--------------------------
DECLARE @sql VARCHAR(max)
SELECT @sql=ISNULL(@sql+',','')+QUOTENAME([日期]) FROM [ta] 
GROUP BY [日期]
EXEC('
SELECT * FROM 
(
SELECT [姓名], [工作时间],[日期] FROM [ta] LEFT JOIN [tb] ON ta.[人员ID]=tb.id
) a
PIVOT(MAX([工作时间]) FOR [日期] IN ('+@sql+')) pit')
/*
姓名 8/1 8/2 8/3 8/4 8/5 8/6 8/7
张三 8 8 8 8 8 8 8
*/

#3


检查   @@servername   和   serverproperty( 'servername ')   是否一致

#4


引用 3 楼  的回复:
检查   @@servername   和   serverproperty( 'servername ')   是否一致

发错地方了 不好意思

#5


如果我现在要查8月一号到8月5号之间的,其他天数的不要该怎么写?