Sql server 2008 SQL Server按重复值分组
我有一个包含idproductype和idcause列的NOTOK表和一个如下所示的查询Sql server 2008 SQL Server按重复值分组,sql-server-2008,Sql Server 2008,我有一个包含idproductype和idcause列的NOTOK表和一个如下所示的查询 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 产品类型
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列对其进行分组,并将最常见的两个原因放在不同的列中,结果如下 产品类型原因1原因2
产品类型1原因1原因2
productType2cause1NULL
产品类型3原因3原因1
我该怎么做呢?您可以使用
cte
来获取最常见的原因,并使用行数
来获取每个产品的前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
您可以使用
cte
来获取最常见的原因,并使用行数
来提供获取每个产品前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
您可以使用
cte
来获取最常见的原因,并使用行数
来提供获取每个产品前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
您可以使用
cte
来获取最常见的原因,并使用行数
来提供获取每个产品前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
根据我对Amireza现在删除的答案的评论,关于不需要
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
(Fiddle是。)根据我对Amireza现在删除的答案的评论,关于不需要
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
(Fiddle是。)根据我对Amireza现在删除的答案的评论,关于不需要
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
(Fiddle是。)根据我对Amireza现在删除的答案的评论,关于不需要
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
(小提琴是。)你能解释一下你想要达到的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含关于其他原因的信息是没有意义的。我想生成一个存储过程,在这个存储过程中,我想得到此表中产品不正常的两个最常见原因。