2013-08-19 32 views
2

嗨我创建了一个MS SQL查询,它正在生成完美结果。但我需要更改行和列的值。我通过互联网搜索并了解到PIVOT改变方向。我已经创建了一些小的查询,但我无法通过任何帮助与连接和组一起使用它。如何使用Joins和Groupby编写PIVOT查询

这里是我的查询和输出

SELECT AttendanceDate,count(attendance)AS attendanceCount,AttOPt.Name AS AttendanceStatus,emp.Name AS MarkedBy FROM Attendance 
LEFT OUTER JOIN AttendanceOption AttOPt 
ON AttOPt.ID=Attendance 
LEFT OUTER JOIN Employee emp 
on MarkedBy=emp.Id 
GROUP BY AttendanceDate,Attendance,MarkedBy,AttOPt.Name,emp.Name 

enter image description here

我喜欢这样的输出:

AttendanceDate Present Absent Half Day WithoutNotification MarkedBy 
14-08-2013  11  0  0   0     Anuj Koundal 
30-08-2013  4  3  2   2     Anuj Koundal 
+0

参考:[链接](http://stackoverflow.com/questions/9802057/pivot-data-in-sql-server?rq = 1) –

回答

2

尝试这一个 -

SELECT * 
FROM ( 
    SELECT AttendanceDate 
     , attendanceCount = COUNT(attendance) 
     , AttendanceStatus = AttOPt.name 
     , MarkedBy = emp.name 
    FROM Attendance 
    LEFT JOIN AttendanceOption AttOPt ON AttOPt.id = Attendance 
    LEFT JOIN Employee emp ON MarkedBy = emp.id 
    GROUP BY 
     AttendanceDate 
    , Attendance 
    , AttOPt.name 
    , emp.name 
) t 
PIVOT 
(
    SUM(attendanceCount) 
    FOR AttendanceStatus IN ([Present], [Absent], [Half Day], [WithoutNotification]) 
) p 
ORDER BY AttendanceDate DESC 

更新:

-- variant #1 

SELECT 
     AttendanceDate 
    , MarkedBy 
    , [Present] = ISNULL([Present], 0) 
    , [Absent] = ISNULL([Absent], 0) 
    , [Half Day] = ISNULL([Half Day], 0) 
    , [WithoutNotification] = ISNULL([WithoutNotification], 0) 
FROM ( 
    ... 
) t 
PIVOT 
(
    ... 
) p 

-- variant #2 

SELECT * 
FROM ( 
    SELECT 
      AttendanceDate 
     , attendanceCount = COUNT(attendance) 
     , AttendanceStatus = AttOPt.name 
     , MarkedBy = emp.name 
    FROM Attendance 
    JOIN AttendanceOption AttOPt ON AttOPt.id = Attendance 
    JOIN Employee emp ON MarkedBy = emp.id 
    GROUP BY ALL 
      AttendanceDate 
     , Attendance 
     , AttOPt.name 
     , emp.name 
) t 
PIVOT 
(
    ... 
) p 

更新2:

DECLARE @Columns NVARCHAR(MAX) 
SELECT @Columns = STUFF((
    SELECT DISTINCT ', [' + a.name + ']' 
    FROM dbo.Attendance t 
    JOIN dbo.AttendanceOption a ON a.id = t.Attendance 
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') 

DECLARE @ColumnsNULLs NVARCHAR(MAX) 
SELECT @ColumnsNULLs = STUFF((
    SELECT DISTINCT ', [' + a.name + '] = ISNULL([' + a.name + '], 0)' 
    FROM dbo.Attendance t 
    JOIN dbo.AttendanceOption a ON a.id = t.Attendance 
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') 

DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL = ' 
SELECT AttendanceDate, ' + @ColumnsNULLs + ', MarkedBy 
FROM ( 
    SELECT AttendanceDate 
     , attendanceCount = COUNT(attendance) 
     , AttendanceStatus = AttOPt.name 
     , MarkedBy = emp.name 
    FROM Attendance 
    LEFT JOIN AttendanceOption AttOPt ON AttOPt.id = Attendance 
    LEFT JOIN Employee emp ON MarkedBy = emp.id 
    GROUP BY 
     AttendanceDate 
    , Attendance 
    , AttOPt.name 
    , emp.name 
) t 
PIVOT 
(
    SUM(attendanceCount) 
    FOR AttendanceStatus IN (' + @Columns + ') 
) p 
ORDER BY AttendanceDate DESC' 

PRINT @SQL 
EXEC sys.sp_executesql @SQL  

输出 -

AttendanceDate   Absent  Half Day Present  Without Notification MarkedBy 
----------------------- ----------- ----------- ----------- -------------------- --------------- 
2013-08-30 00:00:00.000 3   2   4   2     Anuj Kaundal 
2013-08-14 00:00:00.000 0   0   11   0     Anuj Kaundal 
+0

Great soluti只留下小小的东西,如何用0替换NULL 0 in Present,Absent ..列 – MaxPayne

+0

请参阅更新后的答案。 – Devart

+0

Wohoooooooooo像IRON MAN工作 – MaxPayne