SQL Server 2012,如果存在其他行,则仅显示一行

时间:2016-11-24 20:50:34

标签: sql-server tsql sql-server-2012

问题:

运行查询时,我得到了这些结果(列task_externalId):

  • TC229090-10000-3
  • TC229090-20000-3
  • TC229830-10000-3
  • TC229685-10000-3

任务(TC229090)可以包含多行(10000,20000),但也可以只有一行(仅限10000)。

我的完整代码:

SELECT 
    v.voorgemeld_handmatig, v.voorgemeld, v.mac, v.orn, v.cdm, v.blo, 
    v.bco, v.tarcode, (v.timeslotfrom + ' - ' + v.timeslottill),      
    cast (case 
             when 
                (Select ac2.actionSpecificationName 
                 From [COMTECdefault].[dbo].[task] t2 
                 Join [COMTECdefault].[dbo].[actionKind] ak2 On t2.id_actionKind = ak2.id_actionKind 
                 Join [COMTECdefault].[dbo].[actionSpecification] ac2 On ak2.id_actionSpecification = ac2.id_actionSpecification 
                 where t2.task_externalId = (left(t.task_externalId, 15) + '2')) = 'laden' 
                then 'Vol' 
                else 'Leeg' 
          end as text) as IMPORT, 
    t.task_externalId, a.addressName, a.cityName, 
    CONVERT(DATE, t.from_date) as [Date], 
    CONVERT(varchar(8), CONVERT(TIME, t.from_date)) as [Tijd],  
    res.resourceName, resk.resourceKindName, r.shipOwner, 
    t.reference, 
    (Select resourceName 
     From [COMTECdefault].[dbo].[resource] r5 
     Left Outer Join [COMTECdefault].[dbo].resourceKind rk5 On rk5.id_resourceKind = r5.id_resourceKind 
     Where (id_resource = SUBSTRING(pt.StartResources, 0, CHARINDEX(',', pt.StartResources)) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 4) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 3) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 2) 
           or id_resource = PARSENAME(REPLACE(SUBSTRING(pt.StartResources, CHARINDEX(',', pt.StartResources) + 1, LEN(pt.StartResources)), ',', '.'), 1)) 
           and r5.id_resourceKind = 51), 
    udo.udf_Gewicht, udo.udf_Zegelnummer, 
    cast (case when a.addressName = 'APM Terminal 2' 
                  then case when udo.udf_Zegelnummer IS NULL 
                               then 0 
                               else 1 
                       end 
               when a.addressName IN ('ect delta', 'Euromax Terminam C.V.', 'Euromax Terminal') 
                  then case when udo.udf_Gewicht = 0 
                               then 0 
                               else 1 
                       end 
               else 1 
          end as bit) as [voormelden],  
    v.foutcode, v.foutcode_tekst, v.V_door 
FROM 
    [COMTECdefault].[dbo].[task] t 
JOIN 
    [COMTECdefault].[dbo].[actionKind] ak ON t.id_actionKind = ak.id_actionKind 
JOIN 
    [COMTECdefault].[dbo].[actionSpecification] ac ON ak.id_actionSpecification = ac.id_actionSpecification 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceOrder] ro ON t.id_order = ro.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resource] res ON ro.id_resource = res.id_resource 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceKind] resk ON res.id_resourceKind= resk.id_resourceKind 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[address] a ON t.id_address = a.id_address 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[resourceOrder] r ON t.id_order = r.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[order] o ON o.id_order = r.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[voormelden] v ON v.id_task_otd = t.task_externalId 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[ud_order] udo ON udo.id_order = t.id_order 
LEFT OUTER JOIN 
    [COMTECdefault].[dbo].[plannedTask] pt on t.id_task = pt.id_task
WHERE
    (pt.id_Task IS NULL OR pt.taskstate <> 'finished') 
    AND (v.canceled IS NULL OR v.canceled = 0) 
    AND left(res.resourceName, 4) <> 'XXXU'  
    AND t.canceled = 0 
    AND (t.from_date <= '2016-11-24 23:59:59') 
    AND (ac.actionSpecificationName = 'inleveren') 
    AND a.addressName IN ('APM Terminal 1','APM Terminal 2', 'ect delta', 'rwg', 'Euromax Terminam C.V.', 'Euromax Terminal') 
ORDER BY 
    res.resourceName, a.addressName, t.task_externalId

我只想在20000任务存在时显示它。否则显示10000.

提前致谢。

1 个答案:

答案 0 :(得分:1)

我不会触及所有文本,可能会缩小所有联接等等,但这是使用task_exteralid列执行所需操作的模式。

DECLARE @Table AS TABLE (task_externalid VARCHAR(100))
INSERT INTO @Table VALUES 
('TC229090-10000-3')
,('TC229090-20000-3')
,('TC229830-10000-3')
,('TC229685-10000-3')

;WITH cte AS (
    SELECT
       *
       ,RowNumber = ROW_NUMBER() OVER (PARTITION BY
                    LEFT(task_externalid,CHARINDEX('-',task_externalid) - 1)
                    ORDER BY task_externalid DESC)
    FROM
       @Table
)

SELECT *
FROM
    cte
WHERE
    RowNumber = 1
  • ROW_NUMBER的大多数LEFT
  • 上创建分区task_exteralid
  • task_exteralid DESC
  • 订购