2014-01-27 4 views
0

Я написал этот запрос для агрегирования данных из нескольких таблиц. Я хочу, чтобы набор результатов был сгруппирован по идентификатору caseID, но в случае нескольких строк (возможность, я хочу сделать некоторую комбинацию полей.Как свернуть эти поля и строки в этом результирующем наборе

Например, я хочу, чтобы все зубные номера для конкретного случая были объединены в одну цепочку, разделенную запятой, и все записи caseID, которые являются одинаковыми, имеют ту зубную строчку. Минимум MaterialID и пусть будет отображаться во всех записях, имеющих один и тот же идентификатор case

У меня есть обновление, похожее на частичное обновление зубной строчки, но не обрабатывающее все записи.

Вид как в этом примере (Есть больше полей, чем это, как показано на рисунке SQL):

CaseID Material Tooth 
12345 1 12 
12345 2 13 
12345 2 1 
12345 4 5 

CaseID Material Tooth 
12345 1 1,5,12,13 
12345 1 1,5,12,13 
12345 1 1,5,12,13 
12345 1 1,5,12,13 

Вот мой SQL:

IF OBJECT_ID ('tempdb..#tScanRemake') IS NOT NULL DROP TABLE #tScanRemake 

Create Table #tScanRemake 
(
ScanOrderUID VarChar(100) 
,ModelElementUID VarChar (100) 
,ToothElementUID VarChar (100) 
,ScanOrderCaseID VarChar (50) 
,CasesCaseID VarChar (50) 
,RemakeID Varchar (20) 
,ReasonID VarChar (10) 
,Reason VarChar (50) 
,IntOrderID VarChar (100) 
,ExtOrderID VarChar (100) 
,OperatorName VarChar (100) 
,ScanSource VarChar (50) 
,DatabaseID INT 
,MachineGroupID INT 
,ToothNumber Varchar (50) 
,Shade Varchar (20) 
,Anterior_Posterior Varchar (20) 
,Items VarChar (50) 
,IsBridge Bit 
,ScanMaterialID INT 
,ProcessStatusID VarChar (150) 
,DateIn DateTime 
,DateInvoiced DateTime 
,DoctorID Varchar (20) 
,DoctorFirstName Varchar (50) 
,DoctorLastName Varchar (50) 
,PatientFirstName Varchar (50) 
,PatientLastName Varchar (50) 
) 

Insert Into #tScanRemake 

SELECT distinct top 1000 
so.ScanOrderUID 
,se. ModelElementUID 
,st. ToothElementUID 
,so. CaseID ScanOrderCaseID 
,c. CaseID 
,c. RemakeID 
,c. ReasonID 
,r. Reason 
,so. IntOrderID 
,so. ExtOrderID 
,so. OperatorName 
,so. ScanSource 
,so. DatabaseID 
,so. MachineGroupID 
,st. ToothNumber 
,c. Shade 
,CASE WHEN GDLControl.dbo. fn_HasAnteriorTeeth(GDLControl .dbo. fn_ConvertCSVToBitMaskTally(GDLControl .dbo. fn_ParseTeethStrings(st .ToothNumber), ',')) = 1 
    THEN 'Anterior' 
    ELSE 'Posterior' 
END AS Anterior_Posterior 
,se. Items 
,CASE WHEN se. Items like '%Bridge%' 
     THEN 1 
     ELSE 0 
END as IsBridge 
,se. ScanMaterialID 
,so. ProcessStatusID 
,c. DateIn 
,c. DateInvoiced 
,c. DoctorID 
,d. FirstName as DoctorFirstname 
,d. LastName as DoctorLastname 
,c. PatientFirst 
,c. PatientLast 

FROM 
[3ShapeScanOrders] AS so WITH (NOLOCK) 
Left Outer Join 
[LS-DLPlus].[DLPlus] .[dbo]. [Cases] AS c WITH (NOLOCK) 
     ON so. CaseID = c .RemakeOf AND c.remakeof >'' 
Left outer JOIN 
[LS-DLPlus].[DLPlus] .[dbo]. [Reasons] AS r WITH (NOLOCK) 
    ON c. ReasonID = R .ReasonID 
Left Outer JOIN 
[LS-DLPlus].[DLPlus] .[dbo]. [Doctors] AS d WITH (NOLOCK) 
    ON d. DoctorID = c .DoctorID 
INNER JOIN 
[3ShapeScanModelElements] AS se WITH (NOLOCK) 
     ON so. ScanOrderUID = se .ScanOrderUID 
INNER JOIN 
[3ShapeScanToothElements] AS st WITH (NOLOCK) 
     ON so. ScanOrderUID = st .ScanOrderUID  

Where 
so.CaseID >'' 

--Insert Into [GDLDatamart].[dbo].[Shape3ScanRemake] 

--Select 
--ScanOrderUID 
--,ModelElementUID 
--,ToothElementUID 
--,ScanOrderCaseID 
--,Remakeof 
--,ReasonID 
--,Reason 
--,IntOrderID 
--,ExtOrderID 
--,OperatorName 
--,ScanSource 
--,DatabaseID 
--,MachineGroupID 
--,ToothElementTypeID 
--,ToothNumber 
--,Items 
--,ModelHeight 
--,ScanMaterialID 
--,VirtualItem 
--,ProcessStatusID 
--,OrderasofLocalDTS 
--,OrdersasofUTC 
----,OrdersModifiedLocalDTS 
----,OrdersModifiedUTC 
--,ElementasofLocalDTS 
--,ElementasofUTC 
--,ToothasofLocalDTS 
--,ToothasofUTC 

Select * 
from #tScanRemake 

--Where ScanordercaseID = 1014535612 
--Group by ScanOrdercaseID 

--Go 
--Update ToothString  
UPDATE tsr 
SET tsr. ToothNumber = tsr .ToothNumber + ',' + t2. ToothNumber 
FROM #tScanRemake tsr 
    CROSS JOIN #tScanRemake t2 
WHERE Exists (SELECT Distinct ScanOrderUID , ToothNumber 
       FROM #tScanRemake t 
       WHERE 
       ToothNumber < tsr. ToothNumber 
       AND ScanOrderUID = tsr.ScanOrderUID) 

--Go 

--Select * 
--from #tScanRemake 
--Where ScanOrderUID = '97D7FB5F-3129-E211-931A-001D09F2CB34' 
+0

Если вы ищете для запятой-конкатенации в SQL Server, вы можете использовать трюк 'FORXML', объясненный [здесь] (http://sqlserverjunction.wordpress.com/2013/05/10/how-to-use-for-xml-path-to-concatenate-strings-in- t-sql /) или на нескольких сообщениях SO. – jbeldock

ответ

0
SELECT 
caseid, 
MIN(material) Min_Material, 
(select CAST(tooth AS VARCHAR(10)) + ',' from tt b WHERE a.caseid=b.caseid FOR XML PATH('')) list 
FROM tt a 
GROUP BY caseid 
  • тт это ваш таблица
+0

Спасибо JayVee. Это сделал трюк. Раньше я никогда не слышал о FOR XML Path. – CraigBob

Смежные вопросы