2011-03-02 41 views
1

假设我有一个表叫Jobs如何写一个SQL查询来呈现值水平

CREATE TABLE [Jobs] 
(
    [JOBID] [int] IDENTITY(1,1) NOT NULL, 
    [PARTDESC] [nvarchar](64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [OrderPlacedBy] [nvarchar](64) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [SpecialistName] [nvarchar](64) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [Priority] [int] NOT NULL, 
    [Symptoms] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [CustomerNotes] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [ShopNotes] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [JobType] [nvarchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [JobState] [nvarchar](32) COLLATE Latin1_General_CI_AS NULL, 
    [JobAddedDate] [datetime] NOT NULL, 
    [JobStartedDate] [datetime] NULL, 
    [JobFinishedDate] [datetime] NULL, 
    [JobShippedDate] [datetime] NULL, 
    [RecievedDate] [datetime] NULL 
) 

我希望看到水平的专家的名字和他工作的ID。

ANA 201,502,605,701,774 
BEN 102,103,051 
JEN 705,401,402,509,409,408 

专家的肖像有n工作。假设专家ANA有10个工作,BEN有5个工作。

以这种方式,我想向专家展示他的工作水平,其中每个专家的工作数量可能会有所不同。

如何在SQL中执行此操作?

+5

这听起来好像这是你应该在被处理表示层,不试图强制通过TSQL – 2011-03-02 06:52:30

+0

@Marc:有很多情况下,表示层不够灵活,无法处理;您可能需要将此查询放入视图,Excel电子表格或报告引擎中。 – Gabe 2011-03-15 06:13:58

回答

3

Marc是对的。不要在SQL中执行此操作,请在演示级别执行此操作。 不过,如果你想做到这一点,看看这里: How to return 1 single row data from 2 different tables with dynamic contents in sql

适用于您的情况,代码可能是:

 select SpecialistName , LEFT(JobsIds, len(JobsIds)-1) as JobsIds from 
(SELECT j.SpecialistName , 

     (SELECT cast(j1.JobsId as varchar(10)) + ',' 

      FROM Jobs j1 

      WHERE j1.SpecialistName = j.SpecialistName 

      ORDER BY JobId 

      FOR XML PATH('')) AS JobsIds 
     FROM Jobs j 
     GROUP BY SpecialistName)A;