2012-01-18 5 views
3

Один из столбцов моей таблицы - «DataSource». У источника данных может быть два значения, например «A» или «B». Я хотел бы всегда брать строку, когда Datasource = «A», однако, если нет записи для A, я бы хотел взять «B».SQL, условные значения столбцов?

Как это сделать в SQL Server?

РЕДАКТИРОВАТЬ:

Таким образом, для partucular продукта (идентификатор продукта) один идентификатор продукта может иметь две строки, каждая из которых содержит различные DataSource, Wheres другой ProductID может иметь только один источник данных:

{ProductID DataSource} 
{1 A}, 
{1 B}, 
{2 B} 

Здесь Я бы хотел, чтобы выбрать верхний и нижний ряд

+1

Вы должны объяснить свой вопрос немного лучше ... –

+0

Вы можете изменить свой вопрос и поставить пример? –

+0

Вы выбираете только одну запись из всей таблицы? Или пытаетесь получить несколько записей, исключая B, когда существует A? И если да, есть ли у вас другие поля идентификации, поэтому записи A и B могут быть связаны друг с другом? * (Дайте некоторые примеры данных, показывающих, какие записи включать и которые исключать) * – MatBailie

ответ

0

на основе данных выборки, это работает:

SELECT ProductID, MIN(DataSource) 
FROM @tab 
GROUP BY ProductID; 

А вот мой тест данные:

declare @tab table (ProductID int, DataSource char(1)) 
insert into @tab values (1, 'A'); 
insert into @tab values (1, 'B'); 
insert into @tab values (2, 'B'); 

Если есть несколько столбцов в таблице, чем два вы показываете то:

SELECT T1.* 
FROM @tab T1 
JOIN 
(
    SELECT ProductID, MIN(DataSource) AS DataSource 
    FROM @tab 
    GROUP BY ProductID 
) T2 ON T1.ProductID = T2.ProductID AND T1.DataSource = T2.DataSource 
+0

спасибо, я выберу это как ответ из-за использования Group by для меня полезно – mezamorphic

+0

Предполагается, что в таблице не существует других полей. (Это пример, данный OP, поэтому он работает для этого конкретного случая.) Чтобы иметь дело с другими полями, это уже включено во второй вариант в моем ответе. *** [После редактирования это теперь соответствует моему второму варианту] *** – MatBailie

1
select ProductID from product where DataSource= 'A' 
UNION 
select id from DataSource where product not in (select ProductID from product where DataSource = 'A') 
+0

Если нет записей 'DataSource = 'A'', вы не Не нужно исключать их во второй части ... –

+1

@HansKesting - Это охватывает три сценария. Продукты, имеющие * только * DataSourceA, * только * DataSourceB или имеющие * оба * источники данных. * Оба * и * только A * покрываются первым запросом, но * только B * покрывается вторым. – MatBailie

1
SELECT top 1 * 
from YourTable 
ORDER BY DataSource ASC 

Else

если реальные значения NOT 'A' или 'B', которые являются всего лишь заполнители из @A и @b переменные

SELECT top 1 * 
from YourTable 
ORDER BY CASE DataSource WHEN @A THEN 0 ELSE 1 END ASC 

или

если там больше отклонений чем AB

SELECT top 1 * 
from YourTable 
ORDER BY CASE DataSource WHEN @A THEN 0 WHEN @B THEN 1 ELSE 2 END ASC 

ИЛИ

Если вам нужно сгруппировать по PRODUCTID

select * from (
SELECT *, 
ROW_NUMBER OVER(PARTITION BY ProductId ORDER BY CASE DataSource WHEN @A THEN 0 WHEN @B THEN 1 ELSE 2 END ASC) ordinal 
from YourTable 
) t 
WHERE t.Ordinal = 1 
+0

Мои A и B на самом деле являются строковыми значениями, могу ли я использовать второй метод? – mezamorphic

+0

Да, вы можете ... –

+0

Для нескольких продуктов я обновлю ответ –

0

нормально, если я правильно понял вас требование, то это будет работать

select TOP 1 * from yourtable where DATASOURCE = ISNULL(SELECT MAX(DATASOURCE) WHERE DATASOURCE="A","B") 

Идея проста, вы хотите изменить на основе условия DATASOURCE если у вас есть какие-либо строки вашего первого предпочтения («A») или нет, если да, то примените условие «A» или примените условие «B»

+0

, почему это плохой ответ? это работает отлично (не уверенный в лучшем/оптимизированном запросе), но этот ответ не заслуживает новичка –

+0

Я не знаю, кто проголосовал, но ... Ответ не использует TOP 1, так что это явно основанный на наборе подход , В наборе данных кажется вероятным, что есть FK и что у некоторых FK есть DataSourceA, у некоторых FK есть DataSourceB, а у некоторых FK есть оба. В вашем случае, если у ANY есть DataSourceA, тогда возвращается NONE из записей только с DataSouceB. – MatBailie

2

Несколько вариантов, следующих за вашим редактированием ...

SELECT 
    * 
FROM 
    table 
WHERE 
    DataSource = 'A' 
    OR DataSource = 'B' AND NOT EXISTS (SELECT * FROM table AS lookup WHERE ProductID = table.ProductID AND DataSource = 'A') 


SELECT 
    * 
FROM 
    table 
INNER JOIN 
    (SELECT ProductID, MAX(DataSource) AS DataSource FROM table) AS lookup 
    ON lookup.ProductID = table.ProductID 
    AND lookup.DataSource = table.DataSource 


WITH 
    sequenced AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY DataSource) AS sequence_id 
    FROM 
    table 
) 
SELECT 
    * 
FROM 
    sequenced 
WHERE 
    sequence_id = 1 
+0

Благодарим вас за это решение – mezamorphic

+0

+1. –

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