0

所以我成功地提取了我需要的数据,但是现在的问题是 color_code 是一个不是每个人都知道的 2 位数字。因此,为了纠正,我想创建一个 CASE 语句,将这 84 个唯一颜色代码中的每一个替换为特定颜色(例如 69 = 海军蓝)。为了获得颜色代码,我在 product_sku 上使用了 SUBSTRING。

我在这里遇到的真正问题是我试图将这个 CASE 语句粘贴到我的查询中,但在 CASE 处或附近不断出现语法错误:

(CASE
    WHEN SUBSTRING(product_sku,10,2) = 09 THEN SUBSTRING(product_sku,10,2) = 'Black'
    ELSE 'CHECK THIS SHIET FOO'
    FROM l_nvr_ec_returns
END)

当然,这只是用于测试目的的一种颜色,但我做错了什么?或者更重要的是,这个片段到底去了哪里?在我最初的 SELECT 子句之后?求救!

谢谢你,Z

在下面的 Caius Jard 的帮助下,这就是我所在的位置。但收到“无效语法”错误

SELECT
    item_name,
    (SELECT
  CASE SUBSTRING(product_sku,10,2)
    WHEN '09' THEN 'Black'
    WHEN '69' THEN 'Navy'
    ELSE 'Unknown Color'
  END as color
FROM l_nvr_ec_returns) color,
    SUM(return_qty) number_of_returns,
    number_of_returns/  
    (SELECT
    SUM(return_qty)
FROM 
    l_nvr_ec_returns
WHERE 
    return_created_date BETWEEN '2019-10-01' AND '2019-10-31'
    AND return_status NOT IN ('Cancelled', 'cancelled')
    AND return_qty > 0
    AND return_reason_desc = 'Color Not As Expected'
) return_rate



FROM 
    l_nvr_ec_returns
WHERE 
    return_created_date BETWEEN '2019-10-01' AND '2019-10-31'
    AND return_status NOT IN ('Cancelled', 'cancelled')
    AND return_qty > 0
    AND return_reason_desc = 'Color Not As Expected'

GROUP BY item_name, color
ORDER BY color
4

3 回答 3

1

I was also going to add some detail along the lines of alexherm's comment.. I would seriously consider making a table with the 84 values for colors, if you can.. For example like:

--make a table of all our colors
SELECT DISTINCT
  SUBSTRING(product_sku,10,2) as ColorCode,
  'xxxxxxxxxxxxxxxxxxxxx' as ColorName
INTO ColorTable
FROM l_nvr_ec_returns

Now go and edit all the xxxxxxxxx to be proper color names, in every row

OR

Put your massive CASE in this query:

SELECT DISTINCT
  SUBSTRING(product_sku,10,2) as ColorCode,
  CASE SUBSTRING(product_sku,10,2)
    WHEN '01' THEN 'Pink'
    WHEN '02' THEN 'Green'
    ...
    WHEN '84' THEN 'Silver'
END as ColorName
INTO ColorTable
FROM l_nvr_ec_returns

This will create all the correct color names from the get-go without needing to edit the table later


Then use it like:

SELECT * 
FROM
  l_nvr_ec_returns r
  INNER JOIN colortable c ON SUBSTRING(r.product_sku,10,2) = c.colorcode
于 2019-11-14T16:53:19.167 回答
1

仔细编辑您的查询以删除被红色遮挡的字符,留下一个逗号:

在此处输入图像描述

CASE 是应该在选择列表中使用的表达式,用于将单个 SKU 转换为单个颜色,每行 l_nvr_ec_returns

于 2019-11-14T16:59:31.667 回答
0

我对红移并不完全熟悉,但我认为它是基于 postgres 的。如果您的案例如下所示,我希望您的案例能够奏效:

SELECT
  CASE SUBSTRING(product_sku,10,2)
    WHEN '09' THEN 'Black'
    WHEN '69' THEN 'Navy'
    WHEN ... THEN ...

    ELSE 'Unknown Color'
  END as color
FROM l_nvr_ec_returns

CASE 可以有两种形式:

CASE something
  WHEN another_value_matches_something THEN return_value
  WHEN anotheranother_value_matches_something THEN returnanother_value
  ...

CASE 
  WHEN something = another_value_matches_something THEN return_value
  WHEN something = anotheranother_value_matches_something THEN returnanother_value

您选择哪个取决于您是在测试相同的东西还是在运行不同的真值测试,例如

CASE
  WHEN name = 'John' THEN ...
  WHEN age = 20 THEN ....

CASE 通常必须在其 THEN 之后表示一个单一的值。大多数数据库中的 CASE 不能与不产生值的表达式一起使用

这可以工作:

WHERE 
  name =
  CASE WHEN age = 2  THEN (SELECT MAX(petname) FROM pets) ELSE 'noname' END

这可能不会:

WHERE 
  name IN
  CASE WHEN age = 2  THEN (SELECT name FROM pets) ELSE (SELECT 'noname') END

这可能是一个语法错误:

WHERE 
  CASE WHEN SUBSTRING(x, 1, 2) = 'ab' THEN SUBSTRING(x, 5, 2) = 'cd' 

我说可能是因为 MySQL 可能会评估SUBSTRING(x, 5, 6) = 'cd'为布尔值并根据 chars 5 和 6 是否返回 true 或 false xcd但大多数主要数据库不会将其评估为布尔值

于 2019-11-14T16:40:53.417 回答