2015-08-27 3 views
1

Я очень новичок в SQL и не уверен, как выполнить следующее.SQL Beginner: Множество предложений where из той же таблицы

У меня есть список идентификаторов счетчиков, у которых есть целевая стоимость в течение года и заданы данные бюджета за год, однако все они хранятся в одной таблице с идентификатором (TargetType), чтобы различать Target (0) & Бюджет (1)

ID TARGETTYPE VALUE01 VALUE02 ...(etc up to VALUE12) 
123 0   1001  1100 
123 1   9000  9100 
456 0   5000  5100 
456 1   8000  8100  

Желаемый результат будет также включать в себя информацию от нескольких других таблиц необходимо добавить, что в а

Мой запрос до сих пор может принести через один набор данных:

PARAMETERS 
[Utility] Text; 

SELECT 
Contacts.Group, 
Contacts.Site, 
Points.ID, 
Points.Utility, 
Points.MPAN1, 
Target.Value_01 AS [Target JAN], 
Target.Value_02 AS [Target FEB], 
Target.Value_03 AS [Target MAR], 
Target.Value_04 AS [Target APR], 
Target.Value_05 AS [Target MAY], 
Target.Value_06 AS [Target JUN], 
Target.Value_07 AS [Target JUL], 
Target.Value_08 AS [Target AUG], 
Target.Value_09 AS [Target SEP], 
Target.Value_10 AS [Target OCT], 
Target.Value_11 AS [Target NOV], 
Target.Value_12 AS [Target DEC] 

FROM 
((Contacts INNER JOIN Points ON Contacts.[Id] = Points.[Contacts_Id]) 
        INNER JOIN Contracts ON Points.[Id] = Contracts.[Point_Id]) 
        INNER JOIN Target ON Points.Id = Target.DataSetId 

WHERE 
Points.UtilityType =[Utility] 

ORDER BY 
Contacts.ClientGroup; 

Желаемая Выход
(значения будут идти TargetJan до TargetDec, а затем BudgetJan до BudgetDec, но я не показаны для краткости):

Group Site  ID Utility MPAN1 TargetJan TargetFeb etc... BudgetJan BudgetFeb etc...  
ABC London 123 Gas  123456 1,000  1,100   9,000  9,100 
ABC NewYork 456 Gas  ABC123 5,000  5,100   8,000  8,100 

Как я могу добавить в одних и тех же областях, но в зависимости от значение Target.TargetType, я предполагаю, что это запрос Union, но я понятия не имею.

Любые указатели о том, где начать бы с благодарностью получил :)


UPDATE # 1
Спасибо за вашу помощь. Я думаю, что я понимаю запрос, однако все еще есть немного странное поведение, которое я не могу понять.

запрос, используемый

SELECT 
Points.ID, 

    SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_01 else 0 end) AS [TGT JAN], 
    SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_02 else 0 end) AS [TGT FEB], 

FROM 
((Contacts INNER JOIN Points ON Contacts.[Id] = Points.[Contacts_Id]) 
       INNER JOIN Contracts ON Points.[Id] = Contracts.[Point_Id]) 
       INNER JOIN Target ON Points.Id = Target.DataSetId 

GROUP BY 
Points.ID 

ORDER BY 
Points.ID; 


Где моя строка данных имеет только один Target.Type затем запрос возвращает как желательно:
RAW DATA

ID  TARGETTYPE VALUE_01 VALUE_02 
10079 0   7642  5735 

РЕЗУЛЬТАТ

ID TGTJAN TGTFEB 
10079 7642 5735 

Однако ... Если у меня есть ID с 2 или более TargetTypes то выход Значение умножается на 6.

RAW DATA

ID  TARGETTYPE VALUE_01 VALUE_02 
7423 0   58339  57441 
7423 1   1663  1637 

РЕЗУЛЬТАТ

ID TGTJAN TGTFEB 
7423 350034 344646 

У меня экспериментировал и удалял INNER JOIN в таблицу контактов (хотя мне понадобится это соединение), а затем все работает так, как ожидалось ???? Итак, почему проблема с контактами вызывает эту проблему?

Пожалуйста, поставьте меня из моего несчастья, так как я не могу понять, что происходит!

+1

Можете ли вы изменить свой вопрос и добавить пример желаемых результатов? –

+1

И, пожалуйста, сообщите нам, какие СУБД вы используете «* SQL *» - это просто язык запросов, а не конкретный продукт СУБД. И ваш пример использует нестандартный синтаксис (выглядит как SQL Server/T-SQL) –

+0

Я считаю, что это SQL Server, так как это упоминается в справочном документе – CatParky

ответ

0

Для дальнейшего использования я решил эту проблему путем переписывания объединений и изменения способа данных проводятся таким образом, я не нужен ссылаться на таблице контрактов, которая является redudant и, вероятно, способствовал моему странным х по 6 проблема.

SELECT 
Points.ID, 

    SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_01 else 0 end) AS [TGT kWh JAN], 
    SUM(CASE WHEN Target.TargetType = '0' THEN Target.Value_02 else 0 end) AS [TGT kWh FEB], 

    SUM(CASE WHEN Target.TargetType = '1' THEN Target.Value_01 else 0 end) AS [BUD kWh JAN], 
    SUM(CASE WHEN Target.TargetType = '1' THEN Target.Value_02 else 0 end) AS [BUD kWh FEB] 

FROM (Contacts INNER JOIN Points ON Contacts.Id = Points.Contacts_Id) 
         INNER JOIN Target ON Points.Id = Target.DataSetId 

GROUP BY 
Points.ID 

ORDER BY 
Points.ID; 
0

Как насчет использования синтаксиса в случае выбора?

select 
... 
sum(case when Target.TargetType = 'Target' then Target.Value_01 else 0 end) AS [Target JAN], 
sum(case when Target.TargetType = 'Budget' then Target.Value_01 else 0 end) AS [Budget JAN], 
... 
group by 
--all fields in the select list which are not aggregates 
+0

Спасибо, это определенно дал мне отправную точку! 1) Я получаю ошибки, когда использую часть запроса SUM запроса 2) Я получаю повторяющиеся строки для каждого идентификатора, а не значения в одной строке для каждого ID – CatParky

+0

ОШИБКА - это точки столбца. Id 'недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. ВЫБОР Points.ID, Contacts.Text_7, Contacts.Name, сумма (случай, когда Target.TargetType = '0', то Target.Value_01 еще 0 концов) AS [TGT кВтч ЯН] ОТ ((Контакты INNER JOIN Points ON Контакты. [Id] = Очки. [Contacts_Id]) INNER JOIN Контракты ON. [Id] = Контракты. [Point_Id]) INNER JOIN Target ON Точки.Id = Target.DataSetId ORDER BY Contacts.Text_7; GROUP BY Точки.ID, Контакты.Text_7, Контакты. Имя; – CatParky

+0

Я уже сказал вам в своем примере: вы должны поместить все поля в предложение group by, которое находится в списке выбора, которые не являются агрегатами. – Gabor

Смежные вопросы