pryashrma Ответов: 1

Создание Ежемесячного Отчета О Посещаемости


Задача состоит в том, чтобы сформировать ежемесячный отчет
Таблица: tblAttendance
Code Name AttendanceDate Status
---- ---- -------------- ------
A001 Abc Jan-01-2013 Present
B001 Xyz Jan-01-2013 Present
A001 Abc Jan-02-2013 Absent
B001 Xyz Jan-02-2013 Late
A001 Abc Jan-03-2013 Late
.
.


Теперь я должен создать ежемесячный отчет в формате, приведенном ниже
Jan, 2013
Code Name 1 2 3 .. 29 30 31
---- ---- - - - .. -  -  -
A001 Abc  P A L .. L  P  A 
B001 Xyz  P L L .. L  P  A 
.
.


Проблема: не получаю никаких идей для разработки вышеприведенного отчета

Devang Vaja

Вы можете легко сделать это с помощью html-отчетов
tbl=новый htmltable()
tr=новый htmltableRow()
tc=новый htmltablecell()
ТС.для bgcolor="салатовый"
ТС.через свойство innerText=ДС.столы(0).ряды(я)("АТТ")
тр.клетки.добавить(ТС)
ТБЛ.строк.добавить(тр)

а также главное, что вы можете настроить каждую ячейку в цикле
Но вы должны разработать логику для этого в соответствии с вашими требованиями
я сделал этот отчет так, как будто сотрудник находится в половинном отпуске, я показал его камеру наполовину зеленой, а по воскресеньям-Красной...
Вы можете решить это..
ШУБАХ КОДИРОВАНИЯ:)

pryashrma

я не хочу использовать html-отчеты... но ваша идея настройки ячейки великолепна! Спасибо

Devang Vaja

Добро пожаловать..:)

1 Ответов

Рейтинг:
11

Tharaka MTR

для этого я рекомендую вам использовать запрос CROSSTAB. В сводной таблице SQL.
http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx[^]

http://msdn.microsoft.com/en-us/library/ms177410(v=sql. 105). aspx[^]

попробуйте себя. Если у вас есть какие-либо вопросы, не стесняйтесь их задавать.


-------------------------

Проблема с вашей сводной агрегацией. вы можете использовать что-то линейное MAX([Status])

SELECT [EmpCode], [ProjectName],[1] , [2],[3],[4],[5]
FROM 
(SELECT Day([AttendanceDate]) as d1, [EmpCode],[ProjectName],[AttendanceDate] , [Status]
FROM [tebs].[dbo].[View_Attendance]) p
PIVOT(
MAX([Status])
FOR d1 IN (  [1] , [2],[3],[4],[5]) ) AS pvt
ORDER BY 
pvt.[EmpCode],  pvt.[ProjectName];


pryashrma

Спасибо за предложение, я попробовал, но sql express выдает следующую ошибку: неправильный синтаксис рядом с ключевым словом "FOR".

Я понятия не имею, как устранить эту ошибку

Запрос:

Выберите [EmpCode], [ProjectName],[1] , [2],[3],[4],[5]
ОТ
(Выберите день ([AttendanceDate]) как d1, [EmpCode], [ProjectName], [AttendanceDate], [Status]
От [tebs]. [dbo].[View_Attendance]) Р
СТЕРЖЕНЬ(
[Статус]
Для d1 IN ( [1] , [2],[3],[4],[5]) ) как рядовой
ЗАКАЗАТЬ ПО
pvt. [EmpCode], pvt.[Имя проекта];

Может у плз помогите!

Tharaka MTR

Какова ваша версия SQL express? 2005? 2008? и т. д..

Tharaka MTR

Я обновил свой ответ, изменив ваш запрос. пожалуйста, проверьте.

pryashrma

Спасибо, что ответили!

Проблема еще не решена, теперь запрос генерирует n строк для n дат посещаемости для каждого сотрудника... Любое предложение...
EmpCode Имя Проекта 1 2 3 4 5
------- ----------- - - - - -
А100 Р1 нуль нуль нуль нуль П
А100 Р1 нуль нуль нуль нуль П
A100 p1 NULL NULL NULL NULL P
А100 Р1 нуль нуль нуль нуль нуль
А101 Р3 нуль нуль нуль нуль П
А101 Р3 нуль нуль нуль нуль П
A101 p3 NULL NULL NULL NULL L
А102 Р3 нуль нуль нуль нуль П
А102 Р3 нуль нуль нуль нуль П
А102 Р3 нуль нуль нуль нуль
.
.

и я еще прошу ... не могли бы вы объяснить, почему был использован " max (status)"????

Member 13427569

В коде удалить [AttendanceDate] возле инструкции Select--&ГТ;(выберите день([AttendanceDate]) как D1, [EmpCode],[имя_проекта] , [статус]
От [tebs]. [dbo].[View_Attendance]) это должно быть как выше

Tharaka MTR

для быстрого ответа Макс (статус):
вам необходимо предоставить функцию агрегации для сводного запроса.. для этого можно использовать MAX, MIN..

В сводном запросе вы хотите использовать строковые строки, отображаемые в виде столбца. таким образом, лучшая функция агрегации для этого-MAX или MIN

pryashrma

понял!

Tharaka MTR

если вы можете, пожалуйста, предоставьте пример сценария данных..

pryashrma

Используйте [dbAttendance]
ГО

/ * * * * * * Объект: таблица [dbo].[tblAttendance] Дата Написания Сценария: 03.07.2013 10:14:55 ******/
УСТАНОВИТЕ ANSI_NULLS ON
ГО

УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ГО

УСТАНОВИТЬ ПАРАМЕТР ANSI_PADDING НА
ГО

Создайте таблицу [dbo].[tblAttendance](
[AttendanceId] [bigint] IDENTITY(1,1) NOT NULL,
[EmpCode] [varchar](50) NOT NULL,
[Имя проекта] [varchar](50) NOT NULL,
[Status] [char](1) NOT NULL,
[AttendanceDate] [дата] NOT NULL,
[AttendanceBy] [varchar](50) NOT NULL,
[DOE] [datetime] NOT NULL,
[Одобрено] [varchar] (50) NULL,
[ApprovedOn] [datetime] NULL,
[ApprovedFlag] [char](1) NOT NULL,
[Комментарии] [nvarchar] (1500) NULL,
Ограничение [PK_tblAttendance] первичный ключ КЛАСТЕРИЗОВАН
(
[AttendanceId] ASC
)С (КАК = ВЫКЛ, STATISTICS_NORECOMPUTE = OFF, ТО ЗНАЧЕНИЕ IGNORE_DUP_KEY = OFF, ТО ПАРАМЕТРЫ ALLOW_ROW_LOCKS = ON, ТО ALLOW_PAGE_LOCKS ИНСТРУКЦИИ =) НА [ОСНОВНОЙ]
) НА [ПЕРВИЧНОМ]

ГО

НАБОР ВЫБРАНО ЗНАЧЕНИЕ ВЫКЛ.
ГО

Метод exec sys файла.в разделе sp_addextendedproperty @имя=Н'MS_Description', @значение=н'Present-П; отсутствует-а; оставить-л; тур-Т; праздник-ч; воскресенье-с;' , @level0type=Н'SCHEMA',@level0name=Н'dbo', @level1type=Н штрек',@level1name=Н'tblAttendance', @level2type=Н'COLUMN',@level2name=Н'Status'
ГО

Метод exec sys файла.в разделе sp_addextendedproperty @имя=Н'MS_Description', @значение=н'Pending-П; утверждена-а; отклонено-Р' , @level0type=Н'SCHEMA',@level0name=Н'dbo', @level1type=Н штрек',@level1name=Н'tblAttendance', @level2type=Н'COLUMN',@level2name=Н'ApprovedFlag'
ГО

CHill60

"Любые предложения" - отправьте вопрос с помощью  задавать вопрос  ссылка в верхней части страницы. Обязательно включите свой код и четкое описание проблемы. Примерные данные тоже всегда хорошая идея