SQL聚合函数,显示组中是否存在同类值

时间:2017-06-13 18:50:41

标签: ms-access group-by aggregate-functions

我在Access 2016工作,我想知道是否有一个聚合函数给我一个值,但只有当组中的行的值相同时,否则为null。

例如,我有一个账单清单,每个账单都有项目。 (只是一个简单的例子)

Table BILLS
- ID int
- NAME varchar(100)
- ...

Table ITEMS
- ID int
- FK_BILL_ID int
- PRICE currency
- PAID bool
- ...

我的查询如下:

select b.NAME as Name, sum(i.PRICE) as PriceSum, ????(i.PAID) as PayStatus
from BILLS b
left join ITEMS i on i.FK_BILL_ID = b.ID
group by b.ID, b.NAME

我想要实现的目标:

Name   | PriceSum | PayStatus
-------+----------+-------------
Bill A |    19,99 | true
Bill B |    12,34 | false
Bill C |     9,99 | null
Bill D |    99,99 | null
  • 如果所有项目都已付款(PAID = true)
  • ,则PayStatus字段应为true
  • 如果未支付所有项目(PAID = false),则PayStatus字段应为false
  • 另外,PayStatus应该为空(如果没有项目,或者只有部分项目已经支付)

2 个答案:

答案 0 :(得分:0)

鉴于MS Access布尔字段将True存储为-1,将False存储为0,我们可以编写查询,如下所示

SELECT b.BillNAME as BillName,
SUM(i.PRICE) AS PriceSum, IIF(SUM(PAID) =0, "FALSE", IIF( count(*)*-1 
=sum(PAID), "TRUE", "NULL")) as PayStatus
FROM BILLS b
left join ITEMS i on i.FK_BILL_ID = b.ID
GROUP BY BillName;

请注意,由于名称是MS Access中的保留字,我已将字段名称更改为BillName。

答案 1 :(得分:0)

付费字段是/否类型? 在聚合查询中尝试表达式,如:

PayStatus: Switch(Count(*)=Abs(Sum([Paid])),"True", Sum([Paid])=0,"False", True,Null)

名称是保留字。不应该使用保留字作为名称。

当Alok回答时,我正在创作。伟大的思想....虽然只是乘以-1可能比调用Abs()函数更好。