2015-03-19 4 views
1

У меня есть таблица вроде этого:SQL Server: выполнить тест IF, чтобы увидеть, если строка существует

[invoice_lines]:

id (int), customerid (int), price (int), productname (text) 

Я хочу, чтобы запросить эту таблицу, и извлечь все строки. Но мне нужен дополнительный столбец, который может быть столбцом 1/0, который проверяет, существует ли строка, где productname = 'SLA' AND customerid = customerid.

Так позволяет сказать, у меня есть строка, которая выглядит следующим образом:

id customerid price  productname 
----------------------------------------- 
1  134   125  Internet 

Я хочу этот ряд должен быть извлечен, но я хочу увидеть, если есть какие-либо строки с PRODUCTNAME = «ОАС» И CustomerID = '134'. Если есть строка, которая соответствует этим критериям, я хочу, чтобы дополнительный столбец (давал вызов ему SLA), чтобы иметь значение 1. Если оно не существует, я хотел бы, чтобы это значение было 0.

Любые указатели?

+0

Что именно вы подразумеваете под существующим? В таблице, для текущего счета, для текущего клиента? Является ли 'id' идентификатором счета или идентификатором позиции счета? –

+0

@ Dan-Guzman Идентификатор позиции счета-фактуры. Поэтому я хочу проверить, имеет ли клиент, у которого есть строка счета «Интернет», также имеет строку счета «SLA». И если он это сделает, я хочу, чтобы select выбрал «Да» или «1» в пятой колонке. Если у этого клиента нет строки с продуктом «SLA», тогда покажите «нет» или «0». – simenh

ответ

3
select t1.*, 
     case when t2.customerid is not null 
      then 1 
      else 0 
     end as result_check 
from invoice_lines t1 
left join invoice_lines t2 on t1.customerid = t2.customerid 
          and t2.productname = 'SLA' 
+0

Это умножит количество строк, если имеется более одного совпадения с 'SLA'. –

0

Вы можете использовать case на свой новый столбец, который будет проверять, что:

select id, customerid,price,productname 
    case when productname = 'SLA' and customerid = '134' then 1 else 0 end as SLA 
    from [invoice_lines] 
0

Я хотел бы сделать это с CROSS APPLY, потому что присоединяется может производить повторяющиеся строки:

SELECT * 
FROM TableName t1 
CROSS APPLY (SELECT CASE WHEN EXISTS (SELECT * 
             FROM  TableName t2 
             WHERE t2.customerid = t1.customerid AND t2.productname = 'SLA') 
          THEN 1 
          ELSE 0 
         END AS SLA 
      ) a 
0

Вы должны просто используйте exists в select. Или используйте условную агрегацию с помощью оконной функции. Это, вероятно, является наиболее эффективным методом:

select il.*, 
     (case when sum(case when productname = 'SLA' then 1 else 0 end) over (partition by customerid) 
      then 1 
      else 0 
     end) as sla 
from invoice_lines il; 
0

Для всех счетов-фактур строк в таблице, я предлагаю выражение CASE, вокруг функции кадрирования. Комбинированный кластерный/охватывающий индекс с ключом customerid и productname для обеспечения максимальной производительности.

SELECT id 
     , customerid 
     , price 
     , productname 
     , CASE SUM(CASE WHEN productname = 'SLA' THEN 1 
         ELSE 0 
       END) OVER (PARTITION BY customerid) 
      WHEN 0 THEN 0 
      ELSE 1 
     END AS SLA 
FROM invoice_lines il; 

Связанного подзапрос может также выполнять работу, но там, вероятно, будет переломным моментом, когда изменения плана выполнения для обработки большого количества выставления линий.

SELECT id 
     , customerid 
     , price 
     , productname 
     , CASE WHEN EXISTS (SELECT * 
          FROM  dbo.invoice_lines b 
          WHERE b.customerid = a.customerid 
            AND b.productname = 'SLA') THEN 1 
      ELSE 0 
     END AS SLA 
FROM dbo.invoice_lines AS a; 
Смежные вопросы