SQL Server GROUP BY重复值

时间:2013-10-12 09:34:25

标签: sql-server-2008

我有一个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

返回以下数据集

PRODUCTTYPE 原因
productType1原因1
productType1原因1
productType1原因1
productType1原因2
productType1原因2
productType1 cause3
productType2原因1
productType2原因1
productType3 cause3
productType3 cause3
productType3原因1

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

PRODUCTTYPE 原因1 原因2
productType1原因1原因2
productType2原因1 NULL
productType3 cause3原因1

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用cte获取最常见的内容,并使用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

demo

答案 1 :(得分: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

(小提琴是here。)