2

我是一个新手 SQL 程序员,整个早上都在为此苦苦挣扎,所以请多多包涵。我的情况是这样的:我有一张 SKU 表,需要发送到我们的电子商务网站。这些 SKU 中的每一个都有一个“数量”、一个“活跃”值和一个“停产”值。当我们一次处理一个 SKU 时,这很容易处理,但现在我必须发送包含一个或多个 SKU 的套件。

例如,如果我的套件 ID 是 000920_001449_001718_999999(四个 SKU 的组合),我需要收集整个 SKU 集的数据,如下所示:

查询结果

这是我需要合并的逻辑:

  1. 如果任何 SKU 的 IsActive 值为 null 或 WEBNO,则整个套件必须返回 WEBNO。否则,返回 WEBYES。
  2. 如果任何 SKU 的 IsDiscontinued 值为 null 或“1”,则整个套件必须返回 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 字段。有没有一种简洁的方法可以一起解析这个问题,或者有更好的方法来处理这类问题?

4

2 回答 2

2

我认为ISNULLand MIN/的组合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
于 2013-02-07T19:43:10.220 回答
1

如果您在这些表中有一些示例数据的工作示例,我认为这会更容易。从猜测来看,您似乎有一个表函数将字符串分开并给出多行。您有一些正确连接到该临时表的临时表,因此即使临时表中有空值,它也可以使用该函数并基本上返回它获得的所有行。这可能会返回多行,就好像您有一个条件,即您希望在左或右连接上有一个实体,并且有时会有一个空值,您会得到多个。或者,如果您重复了一个值,您将获得倍数。你必须确保你得到一个我相信的结果

Case when 'WEBNO' in 
(

虽然返回“WEBNO”答案的逻辑可能是正确的,但它可能会多次重复行结果,因为引擎可能会解释“这发生了”一次、两次、三次。你可以通过潜在地做一个来缓解这种情况

'Select Distinct IsActive'

这将使表达式仅返回与该列返回不同的单个结果。

如果我们可以看到这些对象包含哪些数据的示例,这将更容易,但这是我的猜测。

于 2013-02-07T19:26:58.027 回答