| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > Выбока SQL из 2-х таблиц |
| Автор: qpash 19.3.2014, 06:08 |
| Добрый день, проблема в выборке из двух таблиц запросом 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 19.3.2014, 07:56 |
Вот бери карандаш и логику работы своего запроса разрисуй - для каждой строчки каждой таблицы. Авось поймёшь... |
| Автор: qpash 19.3.2014, 07:57 |
| Давайте поясню саму задачу: В первой таблице данные по дням, по оборудованию, т.е. Обор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 19.3.2014, 09:04 |
| Вопрос решен с помощью функции Month() |