0

我有一个 NOTOK 表,其中包含 idproductype 和 idcause 列以及一个看起来像这样的查询

SELECT pt.Name, c.Description 
FROM NOTOK n
JOIN ProductType pt ON n.IDProductType = pt.ID
JOIN Cause c ON n.IDCause=c.ID

这将返回以下数据集

产品类型        原因
产品类型1原因1 产品 类型1 原因1 产品类型1 原因1 产品类型1 原因2 产品类型1 原因2 产品类型1 原因3
产品类型2 原因1 产品类型2 原因1 产品类型3 原因3 产品类型3 原因3 产品 类型3 原因 1









现在,我想按 ProductType-column 对其进行分组,并将最常见的两个原因放在不同的列中,所以结果如下

PRODUCTTYPE        CAUSE1        CAUSE2
productType1 cause1 cause2
productType2 cause1 NULL
productType3 cause3 cause1

我该怎么做?

4

2 回答 2

2

您可以使用 acte来获取最常见的原因,并使用ROW_NUMBER来提供一种方法来获取每个产品的前 2 个原因。然后可以将其转换为您需要的结果集。

WITH cte AS
(
 SELECT *, 
   ROW_NUMBER() OVER ( PARTITION BY product_type ORDER BY n DESC ) o
 FROM (
  SELECT product_type, cause, COUNT(1) n
  FROM notok
  GROUP BY product_type, cause
 ) t
)

SELECT product_type, MAX([1]), MAX([2])
FROM cte
PIVOT (
  MAX(cause)
  FOR o IN ([1],[2])
) p
GROUP BY product_type

演示

于 2013-10-12T10:01:27.150 回答
1

根据我对 Amirreza 现在删除的关于不需要的答案的评论PIVOT,这里有一个基于 TI 的答案但没有的示例PIVOT

请注意,这只是为了说明,PIVOT基于 - 的解决方案会产生更有效的查询计划。

WITH cteCause AS (
 SELECT *, 
   ROW_NUMBER() OVER ( PARTITION BY product_type ORDER BY n DESC ) o
 FROM (
  SELECT product_type, cause, COUNT(1) n
  FROM notok
  GROUP BY product_type, cause
 ) t
)
SELECT
  t.product_type,
  (SELECT c.cause FROM cteCause c WHERE c.product_type=t.product_type AND c.o=1) cause1,
  (SELECT c.cause FROM cteCause c WHERE c.product_type=t.product_type AND c.o=2) cause2
 FROM (SELECT DISTINCT product_type FROM notok) t

(小提琴在这里。)

于 2013-10-12T10:30:15.710 回答