![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
qpash |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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, а нужны просто суммы столбов из двух таблиц сгруппированных по имени, по определенным критериям. Подскажите, где ошибся? (Полный запрос приведу, по необходимости) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Вот бери карандаш и логику работы своего запроса разрисуй - для каждой строчки каждой таблицы. Авось поймёшь... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
qpash |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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].[Тех_крат] |
|||
|
||||
qpash |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 9.10.2013 Репутация: нет Всего: нет |
Вопрос решен с помощью функции Month()
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |