Если утверждения в пункте where?

Поэтому мне нужно выполнить запрос к схеме базы данных: http://sqlfiddle.com/#!9/d0b643, но пример схемы будет выглядеть так:

Table 1
itemID          sale date     salesmanID   storeID
---------------------------------------------------
1                 1/2015        1             1
1                 3/2016        1             1
2                 5/2016        2             1
2                 1/2015        4             1

Table 2
itemID           colorID           price
--------------------------------------
1                 1                23
1                 2                10
1                 3                13
2                 1                11
2                 2                14
2                 3                18

Table 3
ColorID       color
---------------------------------------
 1             Red
 2             Blue
 3             Green

Table 4
SaleBegin       SaleEnd      ColorID      salesmanID     storeID
----------------------------------------------------------------
1/1/2014        12/31/2014      1            0             1
1/1/2015        12/31/2015      2            0             1
1/1/2016        12/31/2016      3            0             1
1/1/2014        12/31/2014      3            2             1
1/1/2015        12/31/2016      2            2             1

Мне нужно иметь что-то в предложении where, которое в значительной степени говорит, что если есть SalesmanID и saleDate из Table1 попадает между StartDate и Enddate из Table4, используйте этот цвет. В противном случае, если нет идентификатора продавца, используйте StoreID (в этом примере все они равны 1, но могут быть разными).

Текущий запрос, к которому я это добавляю:

select t1.itemID,t3.color,t2.price
from table_1 t1
LEFT JOIN table_2 t2
ON t1.itemID = t2.itemID
LEFT JOIN table_3 t3
ON t2.colorID = t3.colorID
LEFT JOIN table_4 t4
ON t3.colorID = t4.colorID
WHERE t1.sale_date BETWEEN saleBegin and saleEnd;

Как я могу это запустить? Ожидаемые результаты должны выглядеть так:

itemID цвет цена

1           Blue        10
1           Green       13
2           Blue        14
2           Blue        14

person Mike    schedule 27.05.2016    source источник
comment
попробуйте использовать оператор case в предложении where, это может вам помочь.   -  person Nagaraj    schedule 27.05.2016
comment
Когда salesmanID равно нулю в таблице 4, тогда как нам определить, что такое itemID?   -  person onedaywhen    schedule 27.05.2016


Ответы (2)


Я пытаюсь использовать логику MSSQL. и попробуйте его в скрипте SQL, он запустится успешно. Просто попробуйте этот код самостоятельно, чтобы убедиться, что это то, что вам нужно.

select t1.itemID,t3.color,t2.price from table_1 t1 
LEFT JOIN table_4 t41 
on t1.sale_date BETWEEN t41.saleBegin and t41.saleEnd 
and t41.salesmanID!=0 and t1.salesmanID=t41.salesmanID
LEFT JOIN table_4 t42 
on t1.sale_date BETWEEN t42.saleBegin and t42.saleEnd 
and t42.salesmanID=0 and t1.storeID=t42.storeID
INNER JOIN table_2 t2
ON t1.itemID = t2.itemID
INNER JOIN table_3 t3
ON t2.colorID = t3.colorID and t2.colorID=IF(ISNULL(t41.colorID),t42.colorID,t41.colorID)
order by t1.itemID,t3.color,t2.price;
person Jason Lou    schedule 27.05.2016

Я думаю, это то, что вам нужно. Вы получите слишком много строк из-за совпадения дат @ store @ и Sale. После того, как я изменил ваш образец данных table4, чтобы последние две строки были хранилищем №2, я получаю опубликованные вами результаты.

1/1/2014        12/31/2014      3            2             2 
1/1/2015        12/31/2016      2            2             2 

Select t1.itemID,t3.color,t2.price
    From table_1 t1
    LEFT JOIN table_4 t4 ON t1.sale_date BETWEEN t4.saleBegin And t4.saleEnd And t1.SalesmanID = t4.SalesmanID
    LEFT JOIN table_4 t4a ON t1.sale_date BETWEEN t4a.saleBegin And t4a.saleEnd And t1.StoreID = t4a.StoreID
    LEFT JOIN table_2 t2 ON t1.itemID = t2.itemID And t2.ColorID = t4a.ColorID
    LEFT JOIN table_3 t3 ON t2.colorID = t3.colorID
    Where t4.SalesmanID Is Null
    Group By t1.itemID,t3.color,t2.price
Union All
Select t1.itemID,t3.color,t2.price
    From table_1 t1
    LEFT JOIN table_4 t4 ON t1.sale_date BETWEEN t4.saleBegin And t4.saleEnd And t1.SalesmanID = t4.SalesmanID
    LEFT JOIN table_2 t2 ON t1.itemID = t2.itemID And t2.ColorID = t4.ColorID
    LEFT JOIN table_3 t3 ON t2.colorID = t3.colorID
    Where t4.SalesmanID Is Not Null

itemID  color   price
1       Blue    10.000
1       Green   13.000
2       Blue    14.000
2       Blue    14.000
person Joe C    schedule 27.05.2016
comment
К сожалению, в реальных данных будет совпадение. Проблема в том, что мне нужно сначала посмотреть, есть ли у него идентификатор продавца, если он есть, затем взять цвет / цену из строки дат, между которыми он попадает. Если нет, то возьмите цвет / цену того места, где он совпадает с магазином, из строки, между которой он находится. Это не самая лучшая система, к сожалению, у меня нет возможности переделать ее, и я ее не создавал. - person Mike; 27.05.2016
comment
Что вы хотите сделать, когда есть перекрытие, просто выберите одну из записей наугад? - person Joe C; 27.05.2016
comment
Давайте узнаем, что приоритетнее, если есть перекрытие. - person Jason Lou; 27.05.2016
comment
Я добавил группу по к первому запросу в объединении, который дает желаемые результаты, но не решает проблему, если в одном и том же магазине есть перекрывающиеся продажи с разными цветами. Из-за того, что продажи варьируются в зависимости от диапазона дат, это может быть довольно сложно. Возможно, вам придется расширить диапазон до отдельных дат, чтобы найти точные совпадения, а затем использовать такую ​​функцию, как row_number, чтобы установить приоритет, какой из них вы хотите сохранить. - person Joe C; 27.05.2016
comment
stackoverflow .com / questions / 9140308 / - person Joe C; 27.05.2016
comment
Хорошо, я разберусь с этим. Спасибо, Джо С. - person Mike; 27.05.2016