Помощь - Поиск - Пользователи - Календарь
Полная версия: SQL
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
klem4
Вот такая задача (см. аттач). Честно говоря не очень понимаю что делать.

Подскажите в какую сторону вообще копать с таким вопросом.

volvo
Цитата
в какую сторону вообще копать с таким вопросом.

Ежели SQL Аксессовский - можно попробовать копать в сторону Pivot Tables (запросы вида Transform ... Select ... From ... Pivot ...) и CrossTab Queries (потом посмотришь, как это выглядит в SQL-View "и всего делов" (С))

Насколько я помню, в ANSI SQL этого нет, возможно там есть нечто другое для организации перекрестных запросов.
klem4
Может как-то можно сделать средствами MySQL ?
volvo
Вот такой запрос:
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
Спасибо, появилась собственная мысль, если получится обязательно выложу.
klem4
В общем пока вот что выходит, этот вариант на 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
crazy.gif

таблицак 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
Цитата
Почему-то код отрабатываеткорректно только на 2008 год ...
Хм... У меня что-то твой код показывает только нижние три строки, числа с 1-го по 13-е никак не хочет отображать...
klem4
!4.gif У меня тоже, чот я намудрил, надо разобраться.


нашел баг кажется.
klem4
!low.gif

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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.