2017-10-20 25 views
1

Salut im en utilisant cette requête de sorte que je peux fusionner la valeur dans une colonne, mais lorsque je suis en utilisant cas où il en résulte d'avoir plusieurs colonnes.SQL - Cas Lorsque résultat dans plusieurs colonnes

C'est ma requête

SELECT 
     SR.id, 
     CONVERT(VARCHAR(13), CAST(DR.doc_date AS DATE), 100)  as DOCDATE, 

     --FOR DOC TYPE 
     CASE 
      WHEN 
      SR.net_total IS NOT NULL THEN 'RENT TOTAL' 
     END as [DOC TYPE], 
     CASE 
      WHEN 
      SR.dell_col_charge IS NOT NULL THEN 'CHARGED' 
     END as [DOC TYPE], 
     CASE 
      WHEN 
      SR.CDW IS NOT NULL THEN 'CDW' 
     END as [DOC TYPE], 
     CASE 
      WHEN 
      SP.amount IS NOT NULL THEN 'PAYMENT' 
     END as [DOC TYPE], 
     --FOR DEBIT AND CREDIT 
     CASE WHEN 
      SR.net_total IS NOT NULL THEN SR.net_total 
      END as [DEBIT], 
     CASE WHEN 
      SR.dell_col_charge IS NOT NULL THEN SR.dell_col_charge 
      END as [DEBIT], 
     CASE WHEN 
      SR.CDW IS NOT NULL THEN SR.CDW 
      END as [CREDIT], 
     CASE WHEN 
      SP.amount IS NOT NULL THEN SP.amount 
      END as [CREDIT] 

FROM [dbo].[doc_customer] DC 
LEFT JOIN [dbo].[doc_rent] DR ON DR.doc_sourced_customer_id = DC.id 
LEFT JOIN [dbo].[slip_rent] SR ON SR.doc_sourced_doc_rent_id = DR.id 
LEFT JOIN [dbo].[slip_rent_payment] SP ON SP.doc_sourced_rent_id = DR.id 

WHERE DC.id = '1-1---1-1-1---1--1~1' 
AND DR.deleted = 0 
AND DR.void = 0 

Comme u peut le voir, je veux que mon TYPE DOC à une seule colonne même que le crédit et de débit

est-il une idée ou d'une solution à cela?

Merci

aussi ceci est mon résultat souhaité

enter image description here

EDIT!

ceci est mon résultat lorsque j'utilise ma requête enter image description here

+0

je l'ai déjà essayé d'utiliser seul cas, mais le problème est quand le premier quand réussit il ne montrera pas l'autre type de doc. Vous pouvez voir sur mon résultat souhaité. J'ai vraiment besoin d'aide coincé dans ce problème pendant 8 heures. – FritsJ

Répondre

1

Utilisez un case unique pour chaque expression:

(CASE WHEN SR.net_total IS NOT NULL THEN 'RENT TOTAL' 
     WHEN SR.dell_col_charge IS NOT NULL THEN 'CHARGED' 
     . . . 
    END) as [DOC TYPE], 
    (CASE WHEN SR.net_total IS NOT NULL THEN SR.net_total 
     WHEN SR.dell_col_charge IS NOT NULL THEN SR.dell_col_charge 
     . . . 
    END) as [DEBIT], 
    . . . 

Cependant, cela suppose que chaque ligne ne comporte qu'un seul type de doc.

+0

J'ai déjà essayé cela certaines données ne seront pas affichées. – FritsJ

+0

J'ai posé le même problème jeudi dernier et vous avez répondu correctement mais le problème de cette requête est quand je l'utilise sur mon tableadapter cela ne marchera pas. c'est le lien https://stackoverflow.com/questions/46809494/sql-return-1-or-distinct-values-from-multiple-columns – FritsJ

0

votre requête devrait être comme

SELECT 
     SR.id, 
     CONVERT(VARCHAR(13), CAST(DR.doc_date AS DATE), 100) as DOCDATE, 

     --FOR DOC TYPE 
     CASE 
      WHEN SR.net_total IS NOT NULL THEN 'RENT TOTAL' 
      WHEN SR.dell_col_charge IS NOT NULL THEN 'CHARGED' 
      WHEN SR.CDW IS NOT NULL THEN 'CDW' 
      WHEN SP.amount IS NOT NULL THEN 'PAYMENT' 
     END as [DOC TYPE], 
     --FOR DEBIT AND CREDIT 
     CASE 
      WHEN SR.net_total IS NOT NULL THEN SR.net_total 
      WHEN SR.dell_col_charge IS NOT NULL THEN SR.dell_col_charge 
     END as [DEBIT], 
     CASE 
      WHEN SR.CDW IS NOT NULL THEN SR.CDW 
      WHEN SP.amount IS NOT NULL THEN SP.amount 
     END as [CREDIT] 

FROM [dbo].[doc_customer] DC 
LEFT JOIN [dbo].[doc_rent] DR ON DR.doc_sourced_customer_id = DC.id 
LEFT JOIN [dbo].[slip_rent] SR ON SR.doc_sourced_doc_rent_id = DR.id 
LEFT JOIN [dbo].[slip_rent_payment] SP ON SP.doc_sourced_rent_id = DR.id 

WHERE DC.id = '1-1---1-1-1---1--1~1' 
AND DR.deleted = 0 
AND DR.void = 0 
+0

J'ai déjà essayé ça. Même problème – FritsJ

0

En utilisant une expression case avec plusieurs cas, et coalesce() de prendre la première colonne non null pour debit et credit

select 
    sr.id 
    , convert(varchar(13), cast(dr.doc_date as date), 100) as docdate 
    --for doc type 
    , case 
     when sr.net_total is not null then 'rent total' 
     when sr.dell_col_charge is not null then 'charged' 
     when sr.cdw is not null then 'cdw' 
     when sp.amount is not null then 'payment' 
    end as [doc type] 
    --for debit and credit 
    , coalesce(sr.net_total,sr.dell_col_charge) as [debit] 
    , coalesce(sr.cdw,sp.amount) as [credit] 
from [dbo].[doc_customer] dc 
    left join [dbo].[doc_rent] dr 
    on dr.doc_sourced_customer_id = dc.id 
    left join [dbo].[slip_rent] sr 
    on sr.doc_sourced_doc_rent_id = dr.id 
    left join [dbo].[slip_rent_payment] sp 
    on sp.doc_sourced_rent_id = dr.id 
where dc.id = '1-1---1-1-1---1--1~1' 
    and dr.deleted = 0 
    and dr.void = 0