我有一个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
我该怎么做?
答案 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
答案 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。)