【问题标题】:Column Value Null After Order By Clause按子句排序后的列值为空
【发布时间】:2018-02-05 08:26:03
【问题描述】:

如果 order by 子句未应用于我的列 [pay_date],我将获得列值。以下是创建表并插入虚拟值以设置与我相同的场景的查询

CREATE TABLE [payment_customer]
(
 pay_date datetime ,
 customer_name text,
 pay_amt Memo,
 bal_amt Memo
)


CREATE TABLE [report_invoice]
(
inv_no text,
 inv_date datetime ,
 pname text,
 grand_total Memo
)

Insert Into report_invoice Values 
('INV/17-17/0001',#2017-08-08 00:00:00#,'Customer 1',1000)
Insert Into report_invoice Values 
('INV/17-17/0002',#2017-08-27 00:00:00#,'Customer 1',300)
Insert Into report_invoice Values 
('INV/17-17/0003',#2017-08-27 00:00:00#,'Customer 1',2000)
Insert Into report_invoice Values 
('INV/17-17/0004',#2017-08-27 00:00:00#,'Customer 2',500)
Insert Into report_invoice Values 
('INV/17-17/0005',#2017-08-28 00:00:00#,'Customer 1',3000)
Insert Into report_invoice Values 
('INV/17-17/0006',#2017-08-29 00:00:00#,'Customer 3',700)


Insert Into payment_customer  Values 
(#2017-08-27 00:00:00#,'Customer 1',500,1500)
Insert Into payment_customer  Values 
(#2017-08-28 00:00:00#,'Customer 2',200,300)

最终查询

Select * from
(
Select t1.inv_no,t1.inv_date,t1.pname,t1.grand_total , t2.pay_date,t2.customer_name,t2.pay_amt,t2.bal_amt from report_invoice t1
LEFT  join payment_customer t2 on t1.inv_date = t2.pay_date and t1.pname = t2.customer_name
UNION ALL
Select t2.inv_no,t2.inv_date,t2.pname,t2.grand_total ,  t1.pay_date,t1.customer_name,t1.pay_amt,t1.bal_amt  from payment_customer t1 
LEFT  join report_invoice t2 on  t1.pay_date = t2.inv_date where t2.inv_date is null 
) as v
order by IIF(IsNull(v.inv_date),v.pay_date,v.inv_date)

我得到的结果,但可以看到,2017 年 8 月 28 日的 customer_name、pay_amt、bal_amt 是重复的 inv_no inv_date pname grand_total pay_date customer_name pay_amt bal_amt

INV/17-18/00001 08/08/2017  Veena Industries Ltd.   238.832 
INV/17-18/00002 27/08/2017  Excel Plants            514.95      27/08/2017        Excel Plants & Equipment Pvt. Ltd.         300    214.95
INV/17-18/00003 29/08/2017  I- Tech                 400 
INV/17-18/00004 28/08/2017  VEENA                   514.95      28/08/2017        VEENA                                      300    214.95
INV/17-18/00005 28/08/2017  VEENA                   600         

Result

【问题讨论】:

  • 您认为dated 28/08/2017 is 重复记录如何。只需检查第一列和第三列是否有两条记录是INV/17-18/00004,514.95和INV/17-18/00005,600完全不同。你真的想为每个日期只显示一个记录吗?如果是的话。你需要显示哪一个?
  • 实际上有两个不同的表,如果条件得到满足,我只想加入一次我将只需要 28/08/2017,VEENA , 300 , 214 的行和记录,如果也满足多个条件次
  • 我不明白你想告诉什么。但是,当我加入您提到的“[payment_customer]”和“[report_invoice]”的上述表格时。您需要显示的所需输出是什么。在上述问题中以文本格式显示您的输出。
  • 查看我更新的问题

标签: sql datetime ms-access ms-access-2010 ms-access-2007


【解决方案1】:

您可能需要指定字段的顺序并在 Access SQL 语法中使用真正的日期表达式,并且使用 Currency 表示金额:

pay_date datetime,
customer_name text,
pay_amt Currency,
bal_amt Currency

inv_no text,
inv_date datetime,
pname text,
grand_total Currency

Insert Into report_invoice (inv_no,inv_date,pname,grand_total) 
Values ('INV/17-17/0001',#2017-08-08 00:00:00#,'Customer 1',1000)

【讨论】:

    【解决方案2】:

    修改后试试这个

    Select * from
    (
    Select t1.inv_no,t1.inv_date,t1.pname,t1.grand_total , t2.pay_date,t2.customer_name,t2.pay_amt,t2.bal_amt from report_invoice t1
    LEFT  join payment_customer t2 on t1.inv_date = t2.pay_date and cast(t1.pname as varchar(50)) = cast(t2.customer_name as varchar(50))
    UNION ALL
    Select t2.inv_no,t2.inv_date,t2.pname,t2.grand_total ,  t1.pay_date,t1.customer_name,t1.pay_amt,t1.bal_amt  from payment_customer t1 
    LEFT  join report_invoice t2 on  t1.pay_date = t2.inv_date where t2.inv_date is null 
    ) as v
    order by IIF(v.inv_date is null,v.pay_date,v.inv_date)
    
    Output -
    
    inv_no  inv_date    pname   grand_total pay_date    customer_name   pay_amt bal_amt
    INV/17-17/0001  2017-08-08 00:00:00.000 Customer 1  1000.00 NULL    NULL    NULL    NULL
    INV/17-17/0002  2017-08-27 00:00:00.000 Customer 1  300.00  2017-08-27 00:00:00.000 Customer 1  500.00  1500.00
    INV/17-17/0003  2017-08-27 00:00:00.000 Customer 1  2000.00 2017-08-27 00:00:00.000 Customer 1  500.00  1500.00
    INV/17-17/0004  2017-08-27 00:00:00.000 Customer 2  500.00  NULL    NULL    NULL    NULL
    INV/17-17/0005  2017-08-28 00:00:00.000 Customer 1  3000.00 NULL    NULL    NULL    NULL
    INV/17-17/0006  2017-08-29 00:00:00.000 Customer 3  700.00  NULL    NULL    NULL    NULL
    

    编辑

    检查它是否正常工作

    Select v.inv_no,v.inv_date,v.pname,v.grand_total , v.pay_date,v.customer_name,v.pay_amt,v.bal_amt from
    (
    Select  t1.inv_no,t1.inv_date,t1.pname,t1.grand_total , t2.pay_date,t2.customer_name,t2.pay_amt,t2.bal_amt,ROW_NUMBER() over (partition by t2.pay_amt,t2.bal_amt,t1.inv_date order by t1.inv_date) rn  from report_invoice t1
    LEFT  join payment_customer t2 on t1.inv_date = t2.pay_date and cast(t1.pname as varchar(50)) = cast(t2.customer_name as varchar(50))
    UNION ALL
    Select t2.inv_no,t2.inv_date,t2.pname,t2.grand_total ,  t1.pay_date,t1.customer_name,t1.pay_amt,t1.bal_amt,ROW_NUMBER() over (partition by t1.pay_amt,t1.bal_amt,t2.inv_date order by t2.inv_date) rn  from payment_customer t1 
    LEFT  join report_invoice t2 on  t1.pay_date = t2.inv_date where t2.inv_date is null 
    ) as v
    where rn = 1
    order by IIF(v.inv_date is null,v.pay_date,v.inv_date)
    

    输出

    inv_no  inv_date    pname   grand_total pay_date    customer_name   pay_amt bal_amt
    INV/17-17/0001  2017-08-08 00:00:00.000 Customer 1  1000.00 NULL    NULL    NULL    NULL
    INV/17-17/0004  2017-08-27 00:00:00.000 Customer 2  500.00  NULL    NULL    NULL    NULL
    INV/17-17/0002  2017-08-27 00:00:00.000 Customer 1  300.00  2017-08-27 00:00:00.000 Customer 1  500.00  1500.00
    INV/17-17/0005  2017-08-28 00:00:00.000 Customer 1  3000.00 NULL    NULL    NULL    NULL
    INV/17-17/0006  2017-08-29 00:00:00.000 Customer 3  700.00  NULL    NULL    NULL    NULL
    

    【讨论】:

    • 如您所见 2017-08-27 00:00:00.000 Customer 1 500.00 1500.00 来了两次我希望它只出现一次
    • 查询表达式 RowNumber() 中缺少运算符时出错
    • 但在这里工作正常。你在 sqlserver 中尝试吗?
    • 明确提到了它的MS Access
    • 明确提到了它的 MS Access - 通过添加 sql-server 标签。对。
    【解决方案3】:

    如果我的理解是正确的,这就是你所需要的。

    Select distinct inv_no,inv_date,pname.grand_total,pay_date,customer_name,pay_amt,bal_amt from
    (
    Select t1.inv_no as inv_no,t1.inv_date as inv_date,t1.pname as pname,t1.grand_total as grand_total , 
    t2.pay_date as pay_date,t2.customer_name as customer_name,t2.pay_amt as pay_amt,t2.bal_amt as bal_amt from report_invoice t1
    LEFT  join payment_customer t2 on t1.inv_date = t2.pay_date and t1.pname = t2.customer_name
    UNION ALL
    Select t2.inv_no,t2.inv_date,t2.pname,t2.grand_total ,  t1.pay_date,t1.customer_name,t1.pay_amt,t1.bal_amt  from payment_customer t1 
    LEFT  join report_invoice t2 on  t1.pay_date = t2.inv_date where t2.inv_date is null 
    ) as v
    order by IIF(v.inv_date is null,v.pay_date,v.inv_date)
    

    注意: Isnull 将期望两个参数传递给它。

    CASE 可跨所有 SQL 平台移植,而 IIF 是特定于 SQL SERVER 2012+ 的

    【讨论】:

    • 当 v.inv_date 为 null 然后 v.pay_date 否则 v.inv_date 在 MS Access 中以 asc 结尾时,缺少运算符情况
    • @RahulDesai 现在我已经更新了查询。用它检查一次
    • 当 v.inv_date 为 null 然后 v.pay_date else v.inv_date 在 MS Access 中以 asc 结束时,Same Error Error Missing Operator case
    • 我以为你在 MS Access 中没有 SQL Server.CASE,看看 Switch,IIF。我已经用 IIF 更新了你的查询。现在检查查询 -:)
    • 它有效但结果 (#2017-08-27 00:00:00#,'Customer 1',500,1500) 数据加入后两次我希望它只出现一次
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多