Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server按重复值分组_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server按重复值分组

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 产品类型

我有一个包含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
产品类型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

(小提琴是。)

你能解释一下你想要达到的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含有关其他原因的信息是没有意义的。我想生成一个存储过程,从中获取此表中产品不合格的两个最常见原因。您能解释一下您试图实现的目标吗。让两列最常见的原因包含关于其他原因的信息是没有意义的。我想生成一个存储过程,在这个存储过程中,我想得到此表中产品不正常的两个最常见原因。