использовать group by в подзапросе - PullRequest
1 голос
/ 16 февраля 2012

У меня есть следующий запрос sql

SELECT animal_code, ISNULL(SUM(calve_milk + morning + evening), 0) / 30 AS [Sep 2011],
                          (SELECT     ISNULL(SUM(calve_milk + morning + evening), 0) / 31 AS Expr1
                            FROM          dbo.Status
                            WHERE      (m_date BETWEEN '10/1/2011' AND '10/31/2011')) AS [Oct 2011]
FROM         dbo.Status AS Status_1
WHERE     (m_date BETWEEN '9/1/2011' AND '9/30/2011')
GROUP BY animal_code
ORDER BY animal_code

С помощью этого запроса я вычислил сумму между диапазоном дат и назвал ее [сентябрь 2011], и теперь мне нужно вычислить сумму [октябрь 2011], сгруппировав ее по коду животного, но я думаю, что фиксированный столбец возможен только в подзапрос, но в подзапросе я не могу сгруппировать сумму по коду животного, пожалуйста, помогите мне получить эту сумму по коду животного в подзапросе

Обновление

select a.animal_code,a.Sep2011,b.Oct2011 from 
(SELECT DISTINCT   Images.animal_code, 
REPLACE(REPLACE(ROUND(ISNULL(SUM(Status.calve_milk + Status.morning + Status.evening), 0) / 30, 0), '.', ''), '0', '') Sep2011
FROM Images,Status,animal_Status
where Images.animal_code=Status.animal_code
and     Images.status_id=animal_status.status_id
and status.m_date between '9/1/2011' and '9/30/2011'
and animal_status.status_id=8
group by animal_code) a,
(SELECT DISTINCT   Images.animal_code, 
REPLACE(REPLACE(ROUND(ISNULL(SUM(Status.calve_milk + Status.morning + Status.evening), 0) / 31, 0), '.', ''), '0', '') Oct2011
FROM Images,Status,animal_Status
where Images.animal_code=Status.animal_code
and     Images.status_id=animal_status.status_id
and status.m_date between '10/1/2011' and '10/31/2011'
and animal_status.status_id=8
group by animal_code) b
where a.animal_code=b.animal_code

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Я уверен, что вы не видели мой последний комментарий

Хорошо, я имитирую вашу таблицу, я делаю этот умный запрос (я думаю :)):

SELECT  septable.code, septable.sep, octtable.oct
FROM    (SELECT  code, ISNULL(SUM(mor + milk + ev), 0) / 30 AS sep
             FROM    status
             WHERE  (m_date BETWEEN '09/01/2011' AND '09/30/2011')
             GROUP BY code) AS septable INNER JOIN
                (SELECT  code, ISNULL(SUM(mor + milk + ev), 0) / 31 AS oct
                FROM     status AS status_1
                WHERE  (m_date BETWEEN '10/01/2011' AND '10/30/2011')
                GROUP BY code) AS octtable ON octtable.code = septable.code
0 голосов
/ 16 февраля 2012

Вы не можете расширить свой запрос дополнительными столбцами, чтобы включить новые месяцы, не получая мусора. Сделайте это в электронной таблице или в другом месте.

Попробуйте это как ваш запрос. Он не имеет точного формата, поскольку показывает результаты в виде строк, а не столбцов, но он будет работать для всех месяцев и будущих месяцев. Я заменил 30 на точное количество дней в месяце, также он показывает 2 цифры вместо результата, который всегда округляется в меньшую сторону. я решил показать вам 2 разных способа отображения месяца и года в результате

SELECT animal_code, SUM(isnull(calve_milk,0) + isnull(morning,0) + isnull(evening,0)) / 
-- this replaces your 30
cast(datediff(day, dateadd(month, datediff(month, 0, m_date), 0), dateadd(month, datediff(month, 0, m_date) + 1, 0)) as decimal(9,2))
AS average_milk_per_day,
--this will give you a varcharcolumn showing month and year
stuff(convert(varchar(11), dateadd(month,datediff(month, 0, m_date), 0), 100)
, 4,3,'') monthyear,
--this will give you the month and year as a datetime
dateadd(month, datediff(month, 0, m_date),0) monthyear_as_date
FROM dbo.Status AS Status_1 
WHERE m_date >= '2011-01-09'
GROUP BY animal_code,
datediff(month, 0, m_date)
ORDER BY datediff(month, 0, m_date), animal_code 

Результат за текущий месяц будет ниже, пока все данные не будут зарегистрированы. Если вам нужно, чтобы он рассчитывался только для зарегистрированных дней, а не для целых месяцев, дайте мне знать, и я снова настрою запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...