Разработка запросов к базе данных SQL для установления уровней приоритета - PullRequest
2 голосов
/ 17 марта 2009

У меня возникают проблемы при попытке написать запрос.

Мои таблицы расположены следующим образом:

tblTicketIssues
TicketID | RequesterID

tblPersonnelProfile
PersonnelID | FirstName | LastName

tblTicketAttribute
TicketID | Attribute | AttributeValue

Мне нужно отобразить следующие поля:

TicketID, 
RequesterFullName, 
UrgentPriorityID, 
MediumPriorityID, 
LowPrioritytID

Это сложная часть:

If tblTicketAttribute.Attribute = «Срочно», то значение от tblTicketAttribute.AttributeValue is отображается в столбце UrgentPriority

If tblTicketAttribute.Attribute = «Средний», то значение от tblTicketAttribute.AttributeValue is отображается в столбце MediumPriority

If tblTicketAttribute.Attribute = "Low" тогда значение от tblTicketAttribute.AttributeValue is отображается в столбце LowPriority

Значения в tblTicketAttribute.Attribute включают « Срочный », « Средний », « Низкий », « За 30 », " Over60 ", " Over90 ", " Закрыто "

Как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 17 марта 2009

Ознакомьтесь с инструкцией CASE.

select
 ticketID
 ,Lastname +', '+firstname
 ,CASE attribute 
      WHEN 'Urgent' THEN attributeValue 
      ELSE '' 
 END as UrgentPriorityID
 ,CASE attribute 
      WHEN 'Medium' THEN attributeValue 
      ELSE '' 
 END as MediumPriorityID
 ,CASE attribute 
      WHEN 'Low' THEN attributeValue 
      ELSE '' 
 END as LowPrioritytID

from
 ...
3 голосов
/ 17 марта 2009

Я предположил, что RequestorID является внешним ключом для первичного ключа PersonnelID в tblPersonnelProfile. Это должно сделать это для SQL Server

SELECT
    issues.TicketID, 
    personnel.FirstName + ' ' + personnel.LastName AS RequesterFullName, 
    CASE WHEN attribute.Attribute = 'Urgent' THEN attribute.AttributeValue ELSE NULL END AS UrgentPriorityID, 
    CASE WHEN attribute.Attribute = 'Medium' THEN attribute.AttributeValue ELSE NULL END AS MediumPriorityID, 
    CASE WHEN attribute.Attribute = 'Low' THEN attribute.AttributeValue ELSE NULL END AS LowPrioritytID
FROM
    tblTicketIssues issues
INNER JOIN
    tblPersonnelProfile personnel
ON
    issues.RequestorID = personnel.PersonnelID
INNER JOIN
    tblTicketAttribute attribute
ON
    issues.TicketID = attribute.TicketID
0 голосов
/ 17 марта 2009

Использование оператора CASE, как это сделали jms или Russ, возможно, гораздо лучший способ, но вы также можете использовать подвыборы для решения проблемы:

SELECT  ti.TicketID,
        pp.FirstName || ' ' || pp.LastName AS RequesterFullName,
        (SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Urgent' AND ta.TicketID = ti.TicketID) AS UrgentPriorityID,
        (SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Medium' AND ta.TicketID = ti.TicketID) AS MediumPriorityID,
        (SELECT ta.AttributeValue FROM tblTicketAttribute AS ta WHERE ta.Attribute = 'Low' AND ta.TicketID = ti.TicketID) AS LowPriorityID
FROM    tblTicketIssues AS ti
        INNER JOIN tblPersonnelProfile AS pp ON ti.RequestorID = pp.PersonnelID;

Я подозреваю, что CASE будет намного быстрее, но вы никогда не узнаете, пока не проведете измерения, и иногда подход с дополнительным выбором является вашим единственным вариантом. Вы автоматически получите значения NULL в столбцах дополнительного выбора, если предикат WHERE равен false.

Кроме того, вы можете увидеть совершенно другой способ форматирования запросов SQL, а также более сложный оператор конкатенации Oracle-ish.

Я должен также упомянуть, что дополнительный выбор не будет работать, если столбец TicketID в tblTicketAttribute не уникален, но другие варианты также могут дать странные результаты, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...