2016-11-24 3 views
1

質問他に存在する場合:SQL Server 2012のは、一列のみを表示する

を、私は私のクエリを実行すると、私は、これらの結果(列task_externalId)を取得:

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

タスク(TC229090)は、複数の行(10000,20000)を含むことができますが、1つだけでも構いません(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を表示してください。

ありがとうございます。

+0

により、これら3つの区切られたフィールドまたはちょうど長い文字列であることを?task_exteralid

  • 注文のLEFTほとんどの部分に分割さROW_NUMBERを作成しますか。 –

  • +0

    は長い文字列です。 –

    +1

    'ntext'、' text'、および 'image'データ型は、将来のバージョンのSQL Serverでは削除されます。新しい開発作業でこれらのデータ型を使用しないようにし、現在使用しているアプリケーションを変更する計画を立ててください。代わりに 'nvarchar(max)'、 'varchar(max)'、 'varbinary(max)'を使用してください。 [詳細はこちら](http://msdn.microsoft.com/en-us/library/ms187993.aspx) - 。あなたは 'CAST(..... AS TEXT)'を取り除くべきです... –

    答えて

    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 
    
    • task_exteralid DESC
    関連する問題