多值IF语句,在select中显示

时间:2016-03-08 22:17:15

标签: sql-server database

任何帮助表示赞赏,

以下代码来自某人制作的数据库,每次收据发出时都会发出唯一的收据ID。如果发生逆转,则会发出新的收据。这两者的关联是薪酬数量。如果发出反向,则旧收据上的反向标志会更改为Y,而新的收据会显示为N.我的查询选择了最小日期和最大数据,对于返回的收据,将具有更早的日期,即第一次创建时。问题是当没有反向时,它仍然会提取信息,因为最小和最大日期是相同的。我完全清楚我需要一个if语句,但由于我是数据库新手,因此不知道该怎么做。

blkNames = find_system(bdroot,'lookundermasks','all','BlockType','S-Function');
for blkIdx = 1:numel(blkNames)
  blkHandle = get_param(blkNames{blkIdx}, 'Handle');
  appdata = sfunctionwizard(blkHandle,'GetApplicationData');
  appdata = sfunctionwizard(blkHandle,'Build',appdata);
end

Issue i am having, the return by is the same as created

Desired result

3 个答案:

答案 0 :(得分:1)

这基本上是你想要做的吗?

-- test data creation, for me
create table receipts (receipt_no int, receipt_date datetime, doc_no int, reverse_flag char(1), returned_by varchar(10), create_date datetime, created_date datetime)
insert into receipts values (1, '1/1/2016', 12345, 'Y', 'John', null, '1/1/2016')
insert into receipts values (2, '2/15/2016', 12345, 'N', null, '2/15/2016', '2/15/2016')

SELECT r.receipt_date, r.receipt_no, r.doc_no, r.reverse_flag, ret1.return_date
FROM receipts r
INNER JOIN (
    SELECT doc_no, create_date as return_date
    FROM receipts
    WHERE reverse_flag = 'N')ret1 on r.doc_no = ret1.doc_no and ret1.return_date > r.receipt_date
WHERE r.reverse_flag = 'Y' and r.doc_no = 12345

如果这是您的目标,我认为您只是将其解决到查询的最后:

and r.receipt_date < ret1.return_date

编辑:根据您的更新,我认为最终将其解决:

and convert(date, r.receipt_date) < convert(date, ret1.return_date)

答案 1 :(得分:0)

我仍然不确定你想要什么。

select   *
from     ( select doc_no, min(receipt_date) as min_receipt_date 
            from receipts group by doc_no ) as min_receipt
         left outer join ( select doc_no, max(receipt_date) as max_receipt_date 
            from receipts group by doc_no) as max_receipt
            on min_receipt.doc_no = max_receipt.doc_no and
               min_receipt.min_receipt_date <> max_receipt.max_receipt_date

代表

insert into receipts values (1, '2016-01-01', 12345, 'Y', 'John', null, '2016-01-01');
insert into receipts values (2, '2016-03-15', 12345, 'N', null, '2016-03-15', '2016-03-15');

insert into receipts values (3, '2016-03-15', 123667, 'N', null, '2016-03-15', '2016-03-15');

产量

doc_no  min_receipt_date            doc_no     max_receipt_date
12345   January, 01 2016 00:00:00   12345      March, 15 2016 00:00:00
123667  March, 15 2016 00:00:00     (null)     (null)

但它假定退货日期永远不会与原始收货日期相同。我也没有留下Y和N标志,因为如果最小日期始终是原始购买日期,我看不出它是如何必要的。这里的另一个答案使用created_date但是在表数据的屏幕截图中,您只显示一个日期,所以我只假设一个日期(收据日期)就写了它。我在MySQL上测试过,因为SQLFiddle讨厌插入我的SQL Server语法,而我现在没有其他方法可以测试。

答案 2 :(得分:0)

这就是我想要的,想通了。感谢Max提供有关如何解决问题的见解。

Select distinct r.receipt_date, r.receipt_no, r.doc_no as Payin_No,r.trans_amt,l.location_desc, ct.charge_type_desc, 
        (select un.first_name + ' ' + un.last_name)as cashier,
        r.payee, r.comments, r.cost_centre, r.item, r.programme, r.activity, r.btl_sof, r.reverse_flag, --, ret1.returned_by, ret1.return_date
        (case when  r.reverse_flag = 'Y' then (select (un2.first_name + ' ' + un2.last_name)from Cashier..receipts as r1 
            inner join Cashier..user_name as un2 on un2.user_name=(UPPER(r1.created_by)) where created_date = (select MAX(created_date) 
                                from Cashier..receipts where doc_no = r.doc_no)) end ) as returned_by ,
        (case when r.reverse_flag = 'Y' then (select created_date from Cashier..receipts as r1 
            inner join Cashier..user_name as un2 on un2.user_name=(UPPER(r1.created_by)) where created_date = (select MAX(created_date) 
                                from Cashier..receipts where doc_no = r.doc_no)) end ) as returned_date

from Cashier..receipts as r
inner join Cashier..location as l on r.location_id=l.location_id
inner join [Cashier].[dbo].[charge_type] as ct on ct.charge_type_no=r.charge_type_no
inner join Cashier..user_name as un on un.user_name=(UPPER(r.created_by))


where r.receipt_date = (select MIN(r1.receipt_date) from Cashier..receipts as r1 where r1.receipt_no = r.receipt_no )