Версия для печати темы
Форум «Всё о Паскале» _ Ада и другие языки _ SQL
Автор: klem4 15.07.2008 20:49
Вот такая задача (см. аттач). Честно говоря не очень понимаю что делать.
Подскажите в какую сторону вообще копать с таким вопросом.
Эскизы прикрепленных изображений
Автор: volvo 15.07.2008 23:13
Цитата
в какую сторону вообще копать с таким вопросом.
Ежели SQL Аксессовский - можно попробовать копать в сторону Pivot Tables (запросы вида Transform ... Select ... From ... Pivot ...) и CrossTab Queries (потом посмотришь, как это выглядит в SQL-View "и всего делов" (С))
Насколько я помню, в ANSI SQL этого нет, возможно там есть нечто другое для организации перекрестных запросов.
Автор: klem4 15.07.2008 23:50
Может как-то можно сделать средствами MySQL ?
Автор: volvo 16.07.2008 0:35
Вот такой запрос:
SQL
SELECT
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=1,table1.id,Null)) AS Sun,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=2,table1.id,Null)) AS Mon,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=3,table1.id,Null)) AS Tue,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=4,table1.id,Null)) AS Wed,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=5,table1.id,Null)) AS Thu,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=6,table1.id,Null)) AS Fri,
Sum(IIf(DatePart("w",DateSerial(Year(Date()),Month(Date()),table1.id))=7,table1.id,Null)) AS Sat
FROM Table1 GROUP BY DatePart("ww",DateSerial(Year(Date()),Month(Date()),table1.id))
ORDER BY DatePart("ww",DateSerial(Year(Date()),Month(Date()),table1.id));
Выводит вот такое:
Можно попробовать и "перевернуть" табличку... А насчет MySQL - тоже можно, см. здесь: http://en.wikibooks.org/wiki/Programming:MySQL/Pivot_table
(поправил запрос, забыл впечатать Group By)
Автор: klem4 16.07.2008 11:35
Спасибо, появилась собственная мысль, если получится обязательно выложу.
Автор: klem4 16.07.2008 12:56
В общем пока вот что выходит, этот вариант на 2008г (на любой сделать легко, пока лень править константы) + не пойму пока как названия дней недели присандалить.
SQL
select
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 1 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 1 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 2 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 2 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 3 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 3 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 4 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 4 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 5 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 5 - 1 day), '') as '',
if (month('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 6 - 1 day) = month(now()), dayofmonth('2008-01-01 00:00:00' + INTERVAL (week(now()) + id) * 7 + 6 - 1 day), '') as ''
from tbl;
в таблице TBL одно поле id, забито значениями от 0 до 5
результат вида:
Код
+------+------+------+------+------+------+------+
| | | | | | | |
+------+------+------+------+------+------+------+
| | 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 | | | |
| | | | | | | |
+------+------+------+------+------+------+------+
Автор: klem4 16.07.2008 13:18
таблицак tbl - одно поле - id, значения от 0 до 4 всключительно.
Почему-то код отрабатываеткорректно только на 2008 год ...
SQL
select
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 - 1 day), '') as 'Mon',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 1 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 1 - 1 day), '') as 'Tue',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 2 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 2 - 1 day), '') as 'Wed',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 3 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 3 - 1 day), '') as 'Thu',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 4 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 4 - 1 day), '') as 'Fri',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 5 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 5 - 1 day), '') as 'Sat',
if (month(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 6 - 1 day) = month(now()), dayofmonth(concat(year(now()), '-01-01 00:00:00') + INTERVAL (week(now()) + id) * 7 + 6 - 1 day), '') as 'Sun'
from tbl;
Автор: volvo 16.07.2008 14:32
Цитата
Почему-то код отрабатываеткорректно только на 2008 год ...
Хм... У меня что-то твой код показывает только нижние три строки, числа с 1-го по 13-е никак не хочет отображать...
Автор: klem4 16.07.2008 14:39
У меня тоже, чот я намудрил, надо разобраться.
нашел баг кажется.
Автор: klem4 16.07.2008 18:08
SQL
select
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 7 * id day), '')
as Mon,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 1 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 1 - 7 * id day), '')
as Tue,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 2 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 2 - 7 * id day), '')
as Wed,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 3 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 3 - 7 * id day), '')
as Thu,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 4 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 4 - 7 * id day), '')
as Fri,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 5 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 5 - 7 * id day), '')
as Sat,
if (month(now()) = month(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 6 - 7 * id day), dayofmonth(concat(year(now()), '-', month(now()), '-01 00:00:00') - INTERVAL weekday(concat(year(now()), '-', month(now()), '-01 00:00:00')) - 6 - 7 * id day), '')
as Sun from tbl;
В tbl:
0
1
2
3
4
5