根据其他列中的特定条件选择数据行

时间:2020-02-05 04:00:32

标签: sql sql-server multiple-columns

我有以下数据:

ID_OWN ID_PET KEY NAME
123    1      11  JOY
123    1      11  JOY
123    2      12  JOY
123    2      12  JOY
456    1      13  HELLO
456    1      13  MAMA
456    2      14  HELLO
456    2      14  MAMA

场景是:

如果我选择DISTINCT, ID_OWN 123 将返回2行数据。

但是对于 ID_OWN 456 ,它仍然会返回4行数据,因为 NAME 列具有所有不同的值。

我想要的是,如果 NAME 在相同的 ID_OWN 下具有不同的值,那么我希望将这些 NAME 值粘贴在一起,因此它也将返回2行数据(或基于同一 ID_OWN 下的 ID_PET 的数量的N行数据,在这种情况下,分别为1和2)

以下是预期的返回数据:

ID_OWN ID_PET KEY NAME
123    1      11  JOY
123    2      12  JOY
456    1      13  HELLO MAMA
456    2      14  HELLO MAMA

3 个答案:

答案 0 :(得分:0)

结合使用XML和东西

select distinct ID_OWN , ID_PET, [KEY],
STUFF((Select ' '+ NAME
from yourtable T1
where T1.ID_OWN =T2.ID_OWN and T1.ID_PET =T2.ID_PET  and T1.[KEY] =T2.[KEY] 
FOR XML PATH('')),1,1,'') as stickedName from yourtable  T2

输出为:

ID_OWN  ID_PET  KEY stickedName
123     1       11  JOY
123     2       12  JOY
456     1       13  HELLO,MAMA
456     2       14  HELLO,MAMA

enter image description here

答案 1 :(得分:0)

在SQL Server中,您可以通过demo on db<>fiddle

这样的方式来实现
;WITH cte_TempTable AS (
 SELECT DISTINCT ID_OWN, ID_PET, Key_Number, Name
 FROM TempTable
)
SELECT DISTINCT ID_OWN, ID_PET, Key_Number, SUBSTRING(
(
   SELECT ' ' + Name
   FROM cte_TempTable C1
   WHERE C1.ID_OWN = C2.ID_OWN AND C1.ID_PET = C2.ID_PET AND C1.Key_Number = C2.Key_Number
  FOR XML PATH ('')
), 2, 1000) AS "nAME"
FROM cte_TempTable C2

输出

ID_OWN  ID_PET  Key_Number  nAME
123        1    11          JOY
123        2    12          JOY
456        1    13          HELLO MAMA
456        2    14         HELLO MAMA

答案 2 :(得分:0)

如果是MySQL,则可以按以下方式使用GROUP_CONCAT-

DEMO HERE

SELECT ID_OWN,ID_PET,`Key`, group_CONCAT(NAME)
FROM  (
    SELECT DISTINCT ID_OWN,ID_PET,`Key`, NAME FROM your_table
)A
GROUP BY ID_OWN,ID_PET,`Key`