需要在条件轴上输出十进制值或varchar值的帮助。
对于示例,我创建了两个临时表:class_attendances和Attenance_entry
create table #class_attendances(class_attendance_id int IDENTITY(1,1), class_attendance_date datetime, employee_name varchar(100), attendance_entry_id int)
create table #attendane_entry(attendance_id int IDENTITY(1,1), attendance_value varchar(20), attendance_value_dec decimal(8,2))
下面是Attenance_entry表的插入脚本。
attendance_entry包含3列,分别是id,attenance_value(varchar)和Attenance_value_desc,它们代表出勤条目的十进制值。
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('1.00', 1.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('2.00', 2.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('3.00', 3.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('4.00', 4.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('5.00', 5.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('6.00', 6.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('7.00', 7.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('8.00', 8.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('Absent', 0.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('Holiday', 0.00)
INSERT INTO #attendane_entry (attendance_value, attendance_value_dec) VALUES('OFF', 0.00)
select * from #attendane_entry
attendance_id attendance_value attendance_value_dec
1 1.00 1.00
2 2.00 2.00
3 3.00 3.00
4 4.00 4.00
5 5.00 5.00
6 6.00 6.00
7 7.00 7.00
8 8.00 8.00
9 Absent 0.00
10 Holiday 0.00
11 OFF 0.00
class_attendances表包含员工的出勤情况,其中员工的出勤日期为attenance_date,参考的出勤率为enterance_entry_id
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 1, 'name 1',8)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 2, 'name 1',9)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 3, 'name 1',7)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 4, 'name 1',10)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 5, 'name 1',11)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 1, 'name 2',9)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 2, 'name 2',7)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 3, 'name 2',11)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 4, 'name 2',10)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 5, 'name 2',8)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 1, 'name 3',11)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 2, 'name 3',7)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 3, 'name 3',8)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 4, 'name 3',10)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 5, 'name 3',9)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 2, 'name 4',7)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 4, 'name 4',8)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 1, 'name 5',7)
INSERT INTO #class_attendances (class_attendance_date ,employee_name ,attendance_entry_id) VALUES (getdate() + 3, 'name 5',8)
我创建了一个示例数据透视脚本,如下所示
-- create my base table
create table #base_table (class_attendance_date varchar(10), employee_name varchar(100), attendance_value varchar(20), attendance_value_dec decimal(8,2))
-- insert record to base table
insert into #base_table (class_attendance_date, employee_name, attendance_value, attendance_value_dec)
SELECT convert(varchar(10),#class_attendances.class_attendance_date, 101) as class_attendance_date, #class_attendances.employee_name, #attendane_entry.attendance_value, #attendane_entry.attendance_value_dec
FROM #class_attendances INNER JOIN
#attendane_entry ON #class_attendances.attendance_entry_id = #attendane_entry.attendance_id
--select * from #base_table
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX),
@PivotColumnNames AS NVARCHAR(MAX),
@PivotSelectColumnNames AS NVARCHAR(MAX)
SET @PivotColumnNames = N'';
SELECT @PivotColumnNames = @PivotColumnNames + N', ' + QUOTENAME(class_attendance_date)
FROM( SELECT DISTINCT(class_attendance_date) FROM #base_table AS p GROUP BY class_attendance_date ) AS x;
SELECT @PivotSelectColumnNames = ISNULL(@PivotSelectColumnNames + ',','') + 'ISNULL(' + QUOTENAME(class_attendance_date) + ', 0) AS ' + ' '+ QUOTENAME(class_attendance_date)
FROM (SELECT DISTINCT(class_attendance_date) FROM #base_table AS p GROUP BY class_attendance_date) AS y
SET @DynamicPivotQuery = N'
SELECT employee_name, ' + @PivotSelectColumnNames + ' FROM (
SELECT employee_name, attendance_value_dec, class_attendance_date
FROM #base_table) AS j PIVOT (SUM(attendance_value_dec) FOR class_attendance_date in
('+ STUFF(@PivotColumnNames, 1, 1, '') +')) AS p;';
EXEC sp_executesql @DynamicPivotQuery
枢轴脚本的输出如下所示:
employee_name 06/21/2018 06/22/2018 06/23/2018 06/24/2018 06/25/2018
name 1 8.00 0.00 7.00 0.00 0.00
name 2 0.00 7.00 0.00 0.00 8.00
name 3 0.00 7.00 8.00 0.00 0.00
name 4 0.00 7.00 0.00 8.00 0.00
name 5 7.00 0.00 8.00 0.00 0.00
但是我想要这样的输出。
employee_name 06/21/2018 06/22/2018 06/23/2018 06/24/2018 06/25/2018
name 1 8.00 Absent 7.00 Holiday OFF
name 2 Absent 7.00 OFF Holiday 8.00
name 3 OFF 7.00 8.00 Holiday Absent
name 4 0.00 7.00 0.00 8.00 0.00
name 5 7.00 0.00 8.00 0.00 0.00
有人可以帮我吗?
谢谢。
答案 0 :(得分:1)
您正在错误的列上执行聚合操作。
您有attendance_value_dec
是您当前正在求和的数字,而attendance_value
是您要显示的varchar。
更改您的数据透视查询,改为执行MAX(attendance_value)
。
SET @DynamicPivotQuery = N'
SELECT employee_name, ' + @PivotSelectColumnNames + ' FROM (
SELECT employee_name, attendance_value, class_attendance_date
FROM #base_table) AS j PIVOT (MAX(attendance_value) FOR class_attendance_date in
('+ STUFF(@PivotColumnNames, 1, 1, '') +')) AS p;';
如果您需要将同一天同一个人的出勤值加在一起,那么请确保先在基表上进行此操作,这样您就可以执行MAX()
而不需要{{1} }。