当有一个组时,多行成一行

时间:2016-05-05 01:21:45

标签: sql sql-server sql-server-2014

我需要获取系统中所有活动的列表。一个Activity可以有1个:管理活动的许多服务提供者 - 所以我有一个Ativity表,有多对多的链接表(ActivityServiceProvider)和一个服务提供者列表。

获取数据的查询如下所示。

SELECT a.id, sp.Description
FROM Activity a
INNER JOIN dbo.ActivityServiceProvider asp
    ON asp.ActivityID = a.ID
INNER JOIN dbo.ServiceProvider sp
    ON sp.ID = asp.ServiceProviderID

但由于每个活动可能有多个服务提供者,我需要以某种方式使用STUFF将服务提供者列表放入单行列中。

我尝试了这个,但它失败了,jsut返回了一行:

SELECT 
    STUFF((
        SELECT a.ID, ', ' + MAX(sp.Description) 
        FROM Activity a
        INNER JOIN dbo.ActivityServiceProvider asp
            ON asp.ActivityID = a.ID
        INNER JOIN dbo.ServiceProvider sp
            ON sp.ID = asp.ServiceProviderID
        GROUP BY a.ID 
        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
    ,1,2,'') AS NameValues

有人能发现这个问题吗? 'STUFF'和FOR XML关键字使我感到困惑,所以我可能会犯一个基本错误,但我试图返回一个ActivityID和一个ServiceProviders列,并使用逗号分隔的服务提供者列表。

1 个答案:

答案 0 :(得分:2)

您需要外部查询来获取每个活动。然后子查询合并每个描述的结果。子查询中不需要聚合 - public void buttonClick2(View view) { TextView textView1 = (TextView)findViewById(R.id.word); TextView textView2 = (TextView)findViewById(R.id.definition); TextView textView3 = (TextView)findViewById(R.id.definition2); TextView textView4 = (TextView)findViewById(R.id.definition3); boolean hasDefinition2 = false; if (textView3 !=null){ String text3 = textView3.getText().toString(); if(text3 !=null && !text3.isEmpty()){ hasDefinition2 = true; } } String def2 =""; if(hasDefinition2){ def2 +="\n Definition 2: "+textView3.getText().toString(); } boolean hasDefinition3 = false; if (textView4 !=null){ String text4 = textView4.getText().toString(); if(text4 !=null && !text4.isEmpty()){ hasDefinition3 = true; } } String def3 =""; if(hasDefinition3){ def3 +="\n Definition 3: "+textView4.getText().toString(); } Intent shareIntent1 = new Intent(android.content.Intent.ACTION_SEND); shareIntent1.setAction(android.content.Intent.ACTION_SEND); shareIntent1.setType("text/plain"); shareIntent1.putExtra(android.content.Intent.EXTRA_SUBJECT, "Word"); //<=adding blank quotes shareIntent1.putExtra(Intent.EXTRA_TEXT, textView1.getText().toString()+ "\n"+Definition: +textView2.getText().toString()+ "\n"+def2+ "\n"+def3+ "\n"+"\n"+"@2016 Dictionary"+ "\n"+"Visit us:"); startActivity(Intent.createChooser(shareIntent1, "Share")); } 负责:

FOR XML PATH()