在条件输出方面需要帮助

时间:2018-06-20 02:05:21

标签: sql-server pivot

需要在条件轴上输出十进制值或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

有人可以帮我吗?

谢谢。

1 个答案:

答案 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} }。