2017-10-20 41 views
1

嗨即时通讯使用此查询,所以不知何故我可以合并到1列的价值,但当我使用大小写时,它导致有多个列。SQL - 案例结果成多列

这是我的查询

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 

就像你看到的我希望我的文档类型一列只有一样的借记卡和信用卡

有任何想法或解决方案呢?

感谢

也这是我想要的结果

enter image description here

编辑!

这是我的结果,当我使用我的查询 enter image description here

+0

我已经尝试过使用单一的情况,但问题是当第一个成功时它不会显示其他文档类型。你可以看到我想要的结果。我真的需要帮助一直呆在这个问题上8个小时。 – FritsJ

回答

1

使用单一case每个表达式:

(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], 
    . . . 

然而,这种假设每行只有一个文档类型。

+0

我已经试过这一些数据不会显示。 – FritsJ

+0

上周四我问过同样的问题,你的回答是正确的,但是这个查询的问题是当我在tableadapter上使用它时,它不会工作。这是链接https://stackoverflow.com/questions/46809494/sql-return-1-or-distinct-values-from-multiple-columns – FritsJ

0

您的查询应该像使用

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

我已经试过这个。同样的问题 – FritsJ

0

一个case表达多种情况,并coalesce()采取的第一个非nulldebitcredit

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