Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.27.232] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Здравствуйте! Столкнулся с проблемой нужно перевести процедуру из MSSQL в MySql
/****** Объект: StoredProcedure [dbo].[GetMonthSubjectClassesMarks] Дата сценария: 09/01/2009 22:27:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetMonthSubjectClassesMarks]') AND type in (N'P', N'PC')) BEGIN EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[GetMonthSubjectClassesMarks] ( @className NVARCHAR(50), @subjectName NVARCHAR(50), @month Integer, @year Integer ) AS DECLARE @MAIN_QUERY nvarchar(4000) Set @MAIN_QUERY=''[1],[2],[3],[4],[5],[6],[7],[8],[9],[10], [11],[12],[13],[14],[15],[16],[17],[18],[19],[20], [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] from( SELECT peopleName=( SELECT [name] FROM Peoples where [id]=people_ID), [1],[2],[3],[4],[5],[6],[7],[8],[9],[10], [11],[12],[13],[14],[15],[16],[17],[18],[19],[20], [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] FROM ( SELECT date_today,people_ID,mark=case when mark is null then CHAR(32) else cast(mark as varchar) end FROM( SELECT 6*(we-1) + md AS date_today FROM ( SELECT 1 we UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 union all select 6 ) temp1 CROSS JOIN ( SELECT 1 md UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 union all select 6 ) temp2 WHERE 6*(we-1) + md <= 31)TempTab1 CROSS JOIN ( SELECT peoples.[id] as people_ID from Peoples INNER JOIN Classes ON Peoples.[classID]=Classes.[id] AND Classes.[name]=''''''+cast(@className as varchar)+'''''')TempTab2 LEFT JOIN ( SELECT * from Marks inner join Subjects on Marks.subjectID=Subjects.[id] WHERE Subjects.[name]=''''''+cast(@subjectName as varchar)+'''''')TempTab3 ON TempTab3.[peopleID]=TempTab2.people_ID and month([DateMark])=''+cast(@month as varchar)+'' and year([DateMark])=''+cast(@year as varchar)+'' and day([dateMark])=TempTab1.date_today) P PIVOT ( max(mark) FOR date_today IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17], [18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] ) ) AS pvt)Q order by peopleName'' EXEC(''SELECT peopleName as [''+@subjectName+''], ''+@MAIN_QUERY) ' END Сам запрос: Set @MAIN_QUERY=''[1],[2],[3],[4],[5],[6],[7],[8],[9],[10], [11],[12],[13],[14],[15],[16],[17],[18],[19],[20], [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] from( SELECT peopleName=( SELECT [name] FROM Peoples where [id]=people_ID), [1],[2],[3],[4],[5],[6],[7],[8],[9],[10], [11],[12],[13],[14],[15],[16],[17],[18],[19],[20], [21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] FROM ( SELECT date_today,people_ID,mark=case when mark is null then CHAR(32) else cast(mark as varchar) end FROM( SELECT 6*(we-1) + md AS date_today FROM ( SELECT 1 we UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 union all select 6 ) temp1 CROSS JOIN ( SELECT 1 md UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 union all select 6 ) temp2 WHERE 6*(we-1) + md <= 31)TempTab1 CROSS JOIN ( SELECT peoples.[id] as people_ID from Peoples INNER JOIN Classes ON Peoples.[classID]=Classes.[id] AND Classes.[name]=''''''+cast(@className as varchar)+'''''')TempTab2 LEFT JOIN ( SELECT * from Marks inner join Subjects on Marks.subjectID=Subjects.[id] WHERE Subjects.[name]=''''''+cast(@subjectName as varchar)+'''''')TempTab3 ON TempTab3.[peopleID]=TempTab2.people_ID and month([DateMark])=''+cast(@month as varchar)+'' and year([DateMark])=''+cast(@year as varchar)+'' and day([dateMark])=TempTab1.date_today) P PIVOT ( max(mark) FOR date_today IN ( [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17], [18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31] ) ) AS pvt)Q order by peopleName'' EXEC(''SELECT peopleName as [''+@subjectName+''], ''+@MAIN_QUERY) ' Добавлено Отображает страницу школьного журнала. |
Сообщ.
#2
,
|
|
|
MySql не знает слова PIVOT
Так что лучше не переводить в него такие вещи |