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

Откуда:
Сообщений: 12
Добрый день!
Есть такой запрос в My SQL

SELECT
CONCAT_WS(", ",
CASE MONTH(main.dt) WHEN
1 THEN "Январь" WHEN
2 THEN "Февраль" WHEN
3 THEN "Март" WHEN
4 THEN "Апрель" WHEN
5 THEN "Май" WHEN
6 THEN "Июнь" WHEN
7 THEN "Июль" WHEN
8 THEN "Август" WHEN
9 THEN "Сентябрь" WHEN
10 THEN "Октябрь" WHEN
11 THEN "Ноябрь" WHEN
12 THEN "Декабрь" END,
YEAR(main.dt)) AS mnyr,
Sum((SELECT COUNT(*) FROM main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 1))) AS prnt,
Sum((SELECT COUNT(*) FROM main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 2))) AS resh,
Sum((SELECT COUNT(*) FROM main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 3))) AS treb

FROM main
left outer join
GROUP BY YEAR(main.dt), MONTH(main.dt), mnyr который возвращает след-ее значения см. приложенный рисунок.


Вопрос в следующем: Group by в My SQL и MS SQL работают по разному. В MS SQL она распространяется только на общий запрос а в My SQL сначала в подзапросы и только потом на общий. Каким образом можно получить аналогичный результат в MS SQL как на рисунке?

К сообщению приложен файл. Размер - 9Kb
26 янв 12, 07:13    [11973182]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
SELECT
CASE MONTH(main.dt) WHEN
1 THEN 'Январь, '+convert(varchar(4), YEAR(main.dt)) WHEN
2 THEN 'Февраль, '+convert(varchar(4), YEAR(main.dt)) WHEN
3 THEN 'Март, '+convert(varchar(4), YEAR(main.dt)) WHEN
4 THEN 'Апрель, '+convert(varchar(4), YEAR(main.dt)) WHEN
5 THEN 'Май, '+convert(varchar(4), YEAR(main.dt)) WHEN
6 THEN 'Июнь, '+convert(varchar(4), YEAR(main.dt)) WHEN
7 THEN 'Июль, '+convert(varchar(4), YEAR(main.dt)) WHEN
8 THEN 'Август, '+convert(varchar(4), YEAR(main.dt)) WHEN
9 THEN 'Сентябрь, '+convert(varchar(4), YEAR(main.dt)) WHEN
10 THEN 'Октябрь, '+convert(varchar(4), YEAR(main.dt)) WHEN
11 THEN 'Ноябрь, '+convert(varchar(4), YEAR(main.dt)) WHEN
12 THEN 'Декабрь, '+convert(varchar(4), YEAR(main.dt)) END as mnyr,
SUM(resh_rukv) as prnt
FROM main
WHERE main.resh_rukv = 1
group by month(main.dt), year(main.dt)

Этот запрос работает нормально в MS SQL и возвращает нужные значения.
26 янв 12, 07:17    [11973184]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А left outer join то с кем?
26 янв 12, 07:17    [11973185]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
тут всего одна таблица
26 янв 12, 07:42    [11973193]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
rrusz
тут всего одна таблица
Ну а тогда, тем более, зачем left outer join в запросе?
26 янв 12, 07:53    [11973198]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
Вот сама таблица см. Рисунок.
В My SQL Запрос мне понятен. Мне не понятен MS SQL, мне просто нужен такой же результат как в My SQL. Объединения вполне уместны я считаю.

К сообщению приложен файл. Размер - 24Kb
26 янв 12, 08:02    [11973205]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
rrusz
В My SQL Запрос мне понятен
И что означает такая конструкция в MySQL?
rrusz
FROM main
left outer join
GROUP BY YEAR
26 янв 12, 09:58    [11973495]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
left outer join - это место в первом посте опечатка))) извиняюсь не сразу заметил.
26 янв 12, 10:00    [11973505]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
SELECT
YEAR(main.dt) AS mnyr,
(SELECT COUNT(*) FROM main, main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 1)) AS prnt,
(SELECT COUNT(*) FROM main, main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 2)) AS resh,
(SELECT COUNT(*) FROM main, main mn WHERE (mn.id = main.id) and (mn.resh_rukv = 3)) AS treb
FROM main
GROUP BY YEAR(main.dt), MONTH(main.dt)


этот Group тоже не пашет на внутренний Select
26 янв 12, 10:03    [11973512]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
SELECT
 YEAR(main.dt) AS mnyr,
 count(case when resh_rukv = 1 then 0 end) AS prnt,
 count(case when resh_rukv = 2 then 0 end) AS resh,
 count(case when resh_rukv = 3 then 0 end) AS treb
FROM main
GROUP BY YEAR(main.dt), MONTH(main.dt)
26 янв 12, 10:13    [11973563]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
rrusz
Member

Откуда:
Сообщений: 12
Спасибо огромное
26 янв 12, 10:19    [11973584]     Ответить | Цитировать Сообщить модератору
 Re: Group by  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SET LANGUAGE русский;
SELECT
 DATENAME(MONTH,main.dt)+', '+STR(YEAR(main.dt)) AS mnyr,
 SUM(CASE resh_rukv WHEN 1 THEN 1 ELSE 0 END) AS prnt,
 SUM(CASE resh_rukv WHEN 2 THEN 1 ELSE 0 END) AS resh,
 SUM(CASE resh_rukv WHEN 3 THEN 1 ELSE 0 END) AS treb
FROM main
GROUP BY DATENAME(MONTH,main.dt)+', '+STR(YEAR(main.dt));
26 янв 12, 10:20    [11973587]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить