2013-02-07 46 views
2

我是一個新手SQL程序員,並且一直對我的頭撞這一切,所以請耐心等待。我的情況是這樣的:我有一個需要發送到我們的電子商務網站的SKU表格。這些SKU中的每一個都具有「數量」,「有效」值和「停用」值。當我們一次處理一個SKU時,這很容易處理,但現在我必須發送包含一個或多個SKU的工具包。需要一個SQL Server 2008的case語句來評估一個表並返回兩個值

例如,如果我的包的ID是000920_001449_001718_999999(4個單品的組合),我需要收集數據,像這樣整套的SKU:

Result of query

這是我需要把邏輯:

  1. 如果任何SKU具有空值或WEBNO作爲IsActive值,則整個套件必須返回WEBNO。否則,返回WEBYES。
  2. 如果任何SKU具有空值或'1'作爲IsDiscontinued值,則整個套件必須返回IsDiscontinued ='1'。否則,返回0。

我的代碼是一個有點亂,但這裏是我到目前爲止管理:

SELECT 
CASE WHEN 'WEBNO' in 
(
    SELECT IsActive 
    FROM #SkusToSend as Sending 
    RIGHT JOIN 
    ( 
     SELECT * FROM [eCommerce].[dbo].[Split] (
      '000920_001449_001718_999999' 
      ,'_') 
    ) as SplitSkus 
    on Sending.SKU = SplitSkus.items 
) THEN 'WEBNO' 
ELSE 'WEBYES' 
END 

我的問題是:是否有可能寫一個說法解析我的示例表,只返回一行'IsActive'和'IsDiscontinued'?我試過在這些字段上使用GROUP BY和HAVING語句,但總是得到多行返回。

我有代碼處理WEBNO值,但不是NULL,甚至沒有考慮到IsDiscontinued字段。有沒有一種簡潔的方式來解析這個問題,或者更好的方法來處理這類問題?

回答

2

我認爲ISNULLMIN/MAX組合應該做的伎倆:

SELECT 
    MIN(ISNULL(sending.IsActive, 'WEBNO')) AS IsActive, 
    MAX(ISNULL(sending.IsDiscontinuted, 1)) AS IsDiscontinuted 
FROM 
( 
    SELECT * FROM [eCommerce].[dbo].[Split] (
     '000920_001449_001718_999999' 
     ,'_') 
) AS SplitSkus 
LEFT JOIN #SkusToSend AS Sending 
    AS Sending.SKU = SplitSkus.items 
+0

你先生,是我的英雄。這是完美的! – MadHenchbot

1

我認爲如果你在這些表格中有一些示例數據的工作示例,這會更容易。從猜測它看起來像你有一個表功能拆分一個字符串,並給予多行。你有一些臨時表,右對象加入,這樣就可以使用函數,並且基本上返回它所有的行,即使臨時表中有空值。這可能會返回多行,就好像您有一個條件,您希望單個實體在左側或右側連接,並且有時您會得到倍數。或者如果你有重複的價值,你會得到倍數。你必須確保你得到一個結果之一,我從你的

Case when 'WEBNO' in 
(

相信作爲而邏輯可能是正確的返回「WEBNO的回答,也可能是多次重複的行結果作爲引擎可以一次,兩次,三次解釋「發生這種事情」。您可以通過潛在做

'Select Distinct IsActive' 

這將使表達只返回一個結果是截然不同的該列返回緩解這一點。

如果我們可以看到這些對象所包含的數據的示例,但這將是我的猜測,那麼這將更容易。

+0

臨時表只包含一個SKU,數量,IsActive,並IsDiscontinued領域。我加入了一個功能,將套件拆分爲SKU部件。當我按照建議使用Distinct關鍵字時,我從查詢返回NULL,WEBNO和WEBYES,這很好,但是我的CASE需要處理WEBNO和NULL,並且我仍然需要找出拼圖的IsDiscontinued部分。 .. – MadHenchbot

相關問題