Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбока SQL из 2-х таблиц, Выборка из 2-х таблиц с агрегатными ф. 
:(
    Опции темы
qpash
Дата 19.3.2014, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.10.2013

Репутация: нет
Всего: нет



Добрый день, проблема в выборке из двух таблиц запросом SQL Server 2012:
Имеются 2 таблицы: Tabl1 и Tabl2
Tabl1:
Name        Pole1        Pole2        Pole3        Pole4
Имя1        1               Город1        1        1
Имя1        2               Город1        1        1
Имя1        3               Город1        1        1
Имя1        4               Город1        1        1
Имя1        5               Город1        1        1
Имя2        1               Город1        1        1
Имя2        2               Город1        1        1
Имя2        3               Город1        1        1
Имя2        4               Город1        1        1
Имя2        5               Город1        1        1
Имя3        1               Город1        1        1
Имя3        2               Город1        1        1
Имя3        3               Город5        1        1

Tabl2:
Name        Pole1        Pole2        Plan        Fact
Имя1        1               Город1        10        10
Имя1        2               Город1        10        10
Имя1        3               Город1        10        10
Имя1        4               Город1        10        10
Имя2        3               Город1        10        10
Имя3        3               Город1        10        10
Имя3        4               Город1        10        10
Имя3        5               Город5        10        10


При запросе:
SELECT Tabl1.Name AS [Name], 
SUM(Tabl1.Pole3) AS [Pole3], 
SUM(Tabl1.Pole4) AS [Pole4],
SUM( DISTINCT  Tabl2.Plan) AS [Plan],
SUM( DISTINCT  Tabl2.Fact) AS [Fact]
FROM Tabl1, Tabl2 WHERE
(Tabl1.Name= Tabl2.Name)  AND
(Tabl1.Pole1 BETWEEN '2'  AND  '4') AND
(Tabl2.Pole1 BETWEEN '2'  AND  '4') AND
(Tabl1.Pole2=’Город1’) AND
(Tabl2.Pole2=’Город1’) AND
GROUP BY Tabl1.Name

На выходе:
Name        Pole3        Pole4        Plan        Fact
Имя1        9               9               30        30
Имя2        3               3               10        10
Имя3        4               4               20        20

А должно быть по задумке:
Name        Pole3        Pole4        Plan        Fact
Имя1        3               3               30        30
Имя2        3               3               10        10
Имя3        2               2               20        20

Проблема в том, что именно Pole3 и Pole4 из Tabl1 суммируются и умножаются на кол-во совпавших записей из Tabl2, а нужны просто суммы столбов из двух таблиц сгруппированных по имени, по определенным критериям. 
Подскажите, где ошибся?  (Полный запрос приведу, по необходимости)

PM MAIL   Вверх
Akina
Дата 19.3.2014, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(qpash @  19.3.2014,  07:08 Найти цитируемый пост)
 где ошибся?

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
qpash
Дата 19.3.2014, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.10.2013

Репутация: нет
Всего: нет



Давайте поясню саму задачу:

В первой таблице данные по дням, по оборудованию, т.е.

Обор1-----01.02.2014-----Тут наработка в часах на каждый день
Обор1-----02.02.2014
Обор1-----03.02.2014
Обор2-----01.02.2014
Обор2-----02.02.2014
Обор3-----03.02.2014

а во второй заносится на одно оборудование всего 1 запись в месяц с датой ориентированной на середину месяца (Для выборок с периодом)

Обор1-----15.01.2014---Тут сумма затрат на оборудование за месяц
Обор1-----15.02.2014---Тут сумма затрат на оборудование за месяц
Обор1-----15.03.2014---Тут сумма затрат на оборудование за месяц
Обор2-----15.01.2014---Тут сумма затрат на оборудование за месяц
Обор2-----15.02.2014---Тут сумма затрат на оборудование за месяц
Обор2-----15.03.2014---Тут сумма затрат на оборудование за месяц

Так вот задача - получить таблицу к примеру с 01.01.2014 по 28.02.2014 (за январь и февраль) на каждую единицу оборудования с отображением отклонения по затратам вида:

Обор1----тут наработка за 2 мес ----тут затраты за 2 мес
Обор2----тут наработка за 2 мес ----тут затраты за 2 мес
Обор3----тут наработка за 2 мес ----тут затраты за 2 мес

Я так думал вложенный запрос надо написать, но их еще не делал

Подскажите пожалуйста, оборудование на большом предприятии (2000ед), а у меня именно в этом запросе.

Вот сам используемый запрос все рассчитывает верно, кроме наработок - они все умножены на 6 (6 мес в затратах):

SELECT ([MON].[dbo].[Prost1_2013].[Тех_крат])

,ROUND(SUM([MON].[dbo].[Prost1_2013].[Наработка_план]),1) AS [Наработка_план]
,ROUND(SUM([MON].[dbo].[Prost1_2013].[Наработка_факт]),1) AS [Наработка_факт]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1]),1) AS [План1]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1]),1) AS [Факт1]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1]),1) AS [Откл1]

,CASE WHEN (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])<>0) and (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1])<>0) THEN
ROUND(((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1]))/
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1]))*100,1) ELSE 0 END AS [Проц1]

,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2]),1) AS [План2]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2]),1) AS [Факт2]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2]),1) AS [Откл1]

,CASE WHEN (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])<>0) and (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2])<>0) THEN
ROUND(((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2]))/
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2]))*100,1) ELSE 0 END AS [Проц2]

,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3]),1) AS [План3]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3]),1) AS [Факт3]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3]),1) AS [Откл1]

,CASE WHEN (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])<>0) and (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3])<>0) THEN
ROUND(((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3]))/
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3]))*100,1) ELSE 0 END AS [Проц3]

,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4]),1) AS [План4]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4]),1) AS [Факт4]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4]),1) AS [Откл1]

,CASE WHEN (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4])<>0) and (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4])<>0) THEN
ROUND(((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4]))/
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4]))*100,1) ELSE 0 END AS [Проц4]


,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4]),1) AS [Итог пл]
,ROUND(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4]),1) AS [Итог ф]
,ROUND((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4]))-(SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4])),1) AS [Итог от]

,CASE WHEN (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4])<>0) and (SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4])<>0) THEN
ROUND(((SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4])-SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[Факт4]))/
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План1])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План2])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План3])+
SUM(DISTINCT [MON].[dbo].[Zatr_2013].[План4]))*100,1) ELSE 0 END AS [Итог проц]


,MAX([MON].[dbo].[Prost1_2013].[Тип_обор])
FROM [MON].[dbo].[Prost1_2013], [MON].[dbo].[Zatr_2013] WHERE
([MON].[dbo].[Prost1_2013].[Дата] BETWEEN '2013.07.01' AND '2013.12.31') and ([MON].[dbo].[Prost1_2013].[Объект]='Шатыркуль') and
([MON].[dbo].[Prost1_2013].[Тех_крат]=[MON].[dbo].[Zatr_2013].[Техника]) and ([MON].[dbo].[Zatr_2013].[Дата] BETWEEN '2013.07.01' AND '2013.12.31')
GROUP BY [MON].[dbo].[Prost1_2013].[Тех_крат] 
PM MAIL   Вверх
qpash
Дата 19.3.2014, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.10.2013

Репутация: нет
Всего: нет



Вопрос решен с помощью функции Month()
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0938 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.