Я очень новичок в 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 в таблицу контактов (хотя мне понадобится это соединение), а затем все работает так, как ожидалось ???? Итак, почему проблема с контактами вызывает эту проблему?
Пожалуйста, поставьте меня из моего несчастья, так как я не могу понять, что происходит!
Можете ли вы изменить свой вопрос и добавить пример желаемых результатов? –
И, пожалуйста, сообщите нам, какие СУБД вы используете «* SQL *» - это просто язык запросов, а не конкретный продукт СУБД. И ваш пример использует нестандартный синтаксис (выглядит как SQL Server/T-SQL) –
Я считаю, что это SQL Server, так как это упоминается в справочном документе – CatParky