Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ 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

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 16.07.2008 14:32

Цитата
Почему-то код отрабатываеткорректно только на 2008 год ...
Хм... У меня что-то твой код показывает только нижние три строки, числа с 1-го по 13-е никак не хочет отображать...

Автор: klem4 16.07.2008 14:39

!4.gif У меня тоже, чот я намудрил, надо разобраться.


нашел баг кажется.

Автор: klem4 16.07.2008 18:08

!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