Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите составить хранимку  [new]
Руки-крюки
Member

Откуда:
Сообщений: 681
Есть две таблицы:

TestCategories:
+
Картинка с другого сайта.тыц
Картинка с другого сайта.тыц
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TestCategoriesWithTestCode](
    [TestCategory] [varchar](50) NOT NULL,
    [TestCategoryID] [varchar](10) NOT NULL,
 CONSTRAINT [PK_TestCategoriesWithTestCode] PRIMARY KEY CLUSTERED
(
    [TestCategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO


TestsInfo:
+
Картинка с другого сайта.тыц
Картинка с другого сайта.тыц
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tests_cases_table](
    [Version_No] [int] NOT NULL,
    [Test_ID] [varchar](10) NOT NULL,
    [Test_Name] [varchar](150) NOT NULL,
    [Last_StartAt] [datetime] NULL,
    [Result] [varchar](50) NULL,
    [RunBy] [varchar](50) NULL,
    [Status] [varchar](50) NULL,
    [Priority] [smallint] NOT NULL,
    [Lock_ID] [int] NOT NULL,
    [Last_Duration] [varchar](30) NULL,
 CONSTRAINT [PK_tests_cases_table] PRIMARY KEY CLUSTERED
(
    [Test_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tests_cases_table]  WITH CHECK ADD  CONSTRAINT [FK_tests_cases_table_lock_table] FOREIGN KEY([Lock_ID])
REFERENCES [dbo].[lock_table] ([Lock_ID])
GO
ALTER TABLE [dbo].[tests_cases_table] CHECK CONSTRAINT [FK_tests_cases_table_lock_table]
GO
ALTER TABLE [dbo].[tests_cases_table] ADD  CONSTRAINT [DF_testsCases_table_LastRun_At]  DEFAULT (NULL) FOR [Last_StartAt]
GO
ALTER TABLE [dbo].[tests_cases_table] ADD  CONSTRAINT [DF_testsCases_table_Result]  DEFAULT ('') FOR [Result]
GO
ALTER TABLE [dbo].[tests_cases_table] ADD  CONSTRAINT [DF_testsCases_table_Priority]  DEFAULT ((1)) FOR [Priority]
GO


Test_ID - идшник, вначале всегда идет категория теста (из TestCategories) и дальше целочисленное значение.
Last_StartAt - время последнего запуска, если NULL, то значит вообще не запускалось.
Status - может принимать три значения - NULL, Executed, Executing. Если Executed, то это значит что тест был выполнен. Если Executing, то сейчас выполняется.
Result - результат последнего теста. Может принимать значения: NULL, Warning, Passed, Failed и FailedToExecute. Значение может быть, к примеру Passed, даже если Status пустой. То есть если тест еще не запускался.
Last_Duration - длительность последнего выполнения. Хранится строкой, наверное будет не совсем удобно парсить на стороне сервера.


В итоге нужно получить следующую таблицу:
+
Картинка с другого сайта.тыц
Submitted - насколько я понял всего тестов в категории (с любым статусом).
Total cases – Total count of the test cases found for category.
Executed – Total executed (Percentage = Executed / Total cases)
Passed – Total passed (Percentage = passed / Total executed)
Failed - Total failed (Percentage = failed / Total executed)
Failed to Execute - Total failed to execute (Percentage = failed to execute / Total executed)
Waiting – Total waiting for execution (Percentage = passed / Total executed)
Warning – Total warning (Percentage = passed / Total executed)
Tests per hour - (Total Executed / Time difference in hours )

Грубо говоря нужно составить статистику выполнения тестов по категориям


Я уже замучался. Моего знания SQL не хватает на это.
13 янв 12, 21:53    [11902725]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить хранимку  [new]
эпический трабл
Guest
Руки-крюки
Я уже замучался. Моего знания SQL не хватает на это.

тяжко без групбая-то... :(
13 янв 12, 23:01    [11903013]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить хранимку  [new]
Руки-крюки
Member

Откуда:
Сообщений: 681
эпический трабл
Руки-крюки
Я уже замучался. Моего знания SQL не хватает на это.

тяжко без групбая-то... :(


Группировкой никак не получится.
16 янв 12, 17:02    [11912663]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить хранимку  [new]
Glory
Member

Откуда:
Сообщений: 104751
Руки-крюки
Группировкой никак не получится.

А как без группировки считать агрегаты по "found for category" ?
16 янв 12, 17:08    [11912731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить хранимку  [new]
Руки-крюки
Member

Откуда:
Сообщений: 681
Glory
Руки-крюки
Группировкой никак не получится.

А как без группировки считать агрегаты по "found for category" ?


Допустим по какой-то категории не будет проваленных тестов (с Result = 'Failed'), то эта категория вообще потеряется.

SELECT        TestCategories.TestCategory, COUNT(*) AS Failed
FROM           TestsInfo INNER JOIN
                  TestCategories ON TestsInfo.Test_ID LIKE TestCategories.TestCategoryID + '%'
GROUP BY     TestCategories.TestCategory, TestCategories.TestCategoryID, TestsInfo.Status, TestsInfo.Result
HAVING        (TestsInfo.Status = 'Executed') AND (TestsInfo.Result = 'Failed')


Такой же запрос делаем для Passed тестов. В результате для Failed тестов нет определенной категории, а для Passed она есть. Делаем inner join двух полученных таблиц и категория теряется.

Вобщем я сделал через цикл.

DECLARE @Result table
	(
		TestCategory varchar(50) NOT NULL, 
		TestCategoryID varchar(10) NOT NULL,
		Total int NOT NULL,
		Executed int NOT NULL,
		Passed int NOT NULL,
		Failed int NOT NULL,
		FailedToExecute int NOT NULL,
		Waiting int NOT NULL,
		Warning int NOT NULL,
		Duration time NOT NULL
	)

	/* Cycle by categories */
	DECLARE CategoryCursor CURSOR FOR
		SELECT * 
		FROM TestCategoriesWithTestCode
	DECLARE @TestCategory VARCHAR(50)
	DECLARE @TestCategoryID VARCHAR(10)

	OPEN CategoryCursor

	FETCH NEXT FROM CategoryCursor
	INTO @TestCategory, @TestCategoryID

	WHILE @@FETCH_STATUS = 0
		BEGIN
			/* Calculation statistics for category */
			DECLARE @Total int = 0
			DECLARE @Executed int = 0
			DECLARE @Passed int = 0
			DECLARE @Failed int = 0
			DECLARE @FailedToExecute int = 0
			DECLARE @Waiting int = 0
			DECLARE @Warning int = 0
			DECLARE @Duration time = '00:00:00'

			SELECT 
				@Total = @Total + 1,
				@Executed = CASE WHEN Status = 'Executed' THEN @Executed + 1 ELSE @Executed END,
				@Passed = CASE WHEN Status = 'Executed' AND Result = 'Passed' THEN @Passed + 1 ELSE @Passed END,
				@Failed = CASE WHEN Status = 'Executed' AND Result = 'Failed' THEN @Failed + 1 ELSE @Failed END,
				@FailedToExecute = CASE WHEN Status = 'Executed' AND Result = 'FailedToExecute' THEN @FailedToExecute + 1 ELSE @FailedToExecute END,
				@Waiting = CASE WHEN Status = 'Executing' THEN @Waiting + 1 ELSE @Waiting END,
				@Warning = CASE WHEN Status = 'Executed' AND Result = 'Warning' THEN @Warning + 1 ELSE @Warning END,
				@Duration = CASE WHEN Status = 'Executed' THEN DateAdd(Second, DateDiff(Second, 0, @Duration), Last_Duration) ELSE @Duration END
			FROM tests_cases_table
			WHERE Test_ID LIKE @TestCategoryID + '%'

			/* Insert statistics to result table */
			INSERT INTO @Result
			VALUES (@TestCategory, @TestCategoryID, @Total, @Executed, @Passed, @Failed, @FailedToExecute, @Waiting, @Warning, @Duration)
		
			FETCH NEXT FROM CategoryCursor
			INTO @TestCategory, @TestCategoryID
		END
	CLOSE CategoryCursor
	DEALLOCATE CategoryCursor

	SELECT *
	FROM @Result
16 янв 12, 21:41    [11914384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить хранимку  [new]
Glory
Member

Откуда:
Сообщений: 104751
А курсор то зачем ?
16 янв 12, 21:54    [11914448]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить