【发布时间】:2016-01-18 23:08:59
【问题描述】:
我有一个表,其中包含一个id 和两个产品列product 和product_other。 product 列可能有一个有效的产品名称、单词“其他”,或者是空白的,因为它来自源。如果product 为“其他”,则product_other 应具有有效的产品名称,否则可能为空白或随机包含有效的产品名称。
我需要将所有有效的产品名称拉到一个列中,并排除空白和“其他”条目。到目前为止,我已经尝试了两种方法,UNION 方法如下:
SELECT DISTINCT * FROM
(
SELECT id
, COALESCE(NULLIF(NULLIF(product, 'other'), ''), 'UNKNOWN') AS product
FROM myTable
UNION
SELECT id
, COALESCE(NULLIF(product_other, ''), 'UNKNOWN') AS product
FROM myTable
) k
ORDER BY id
这会生成所有行,包括 product 的“UNKNOWN”值和同一 product_other 的有效产品名称 id,但它应该只提供有效名称(如果有的话)。
我使用的另一种方法是下面的CASE WHEN 方法:
SELECT id
, CASE COALESCE(NULLIF(product, ''), 'UNKNOWN')
WHEN 'other' THEN COALESCE(NULLIF(product_other, ''), 'UNKNOWN')
ELSE COALESCE(NULLIF(product_other, ''), 'UNKNOWN')
END AS product
FROM myTable
ORDER BY id
然而,这个仅生成了一个有效product 的列表(如果可用)或product_other(当product 为“其他”或空白时)。它排除了存在有效 product product 和 product_other 值的情况。
另一种看待它的方式是,如果您 SELECT id, count(*) FROM (either 查询为 k ) GROUP BY id,则在第一种情况下,无论一个是否为“UNKNOWN”,都会有行数为 2,而第二个将始终每个 id 只有 1 行。
所以,myTable 看起来像这样:
id product product_other
------ --------- ---------------
155535 OTC COM
155536 OTC
155537 other COM
155538
我希望查询结果如下所示:
id product
------ ---------
155535 OTC
155535 COM
155536 OTC
155537 COM
155538 UNKNOWN
谢谢。
【问题讨论】:
标签: tsql sql-server-2012 unpivot