2012-09-27 67 views
0

我在下面有这个连接查询。我有一个问题。 shipmentUnits列出错了。它只是计算总项目。问题是我计算了两组除了发货字段以外共有的所有对象。postgres SQL查询计数两组对象

SELECT count(*) as "units", (select count("EsnsVmas".*) from "EsnsVmas" where 
     "EsnsVmas"."shipped" = false AND "EsnsVmas"."VmaId" = 2 AND "EsnsVmas"."approved" = 
     true) as "shippedUnits", "Vmas".*, "Vendors"."name" as "name", "EsnsVmas".id as  
     "OrderItemId", "PurchaseOrderItems"."price", "Grades"."name" as "vendorGrade", 
     "Items"."name" as "model", "Items".id as "ItemId", "Grades".id as "GradeId" 
FROM "Vmas" 
     JOIN "EsnsVmas" on ("EsnsVmas"."VmaId" = "Vmas".id) 
     JOIN "Esns" on ("EsnsVmas"."EsnId" = "Esns".id) 
     JOIN "PurchaseOrderItems" on ("Esns"."PurchaseOrderItemId" = 
      "PurchaseOrderItems".id) 
     JOIN "Items" on ("PurchaseOrderItems"."ItemId" = "Items".id) 
     JOIN "Grades" on ("PurchaseOrderItems"."GradeId" = "Grades".id) 
     JOIN "Vendors" on ("Vmas"."VendorId" = "Vendors".id) 
WHERE "Vmas".id =2 AND "EsnsVmas"."approved" = true 
GROUP BY "Vmas".id, "PurchaseOrderItems".id, "Grades".id, "Items".id, "Vendors".id, "EsnsVmas".id ; 
+1

似乎在shipmentUnits查询和外部查询之间没有关系 - 即它将在所有行中产生相同的值。这是它应该做什么?或者是子查询应该每行有所不同? – jcern

+0

它应该每行不同。 ShippedUnits仅仅是批准并发货的EsnsVmas。单位只是EsvVmas被批准,并没有发货。实际上你的关系是正确的。但那只是因为我修改了这个问题,并拿出了一堆我认为不必要的连接和字段。 – user1175817

+0

我需要将它们添加回去吗?或者您可以回答如何使用这种方式使用连接执行两个计数的问题 – user1175817

回答

1

看来除了硬编码的VmaId =“2”之外,内部和外部查询之间没有关系。因为我没有在数据库中的表,我不能测试,以确保它的作品 - 但这里是我的第一枪在可能的修复:

SELECT count(*) as "units", (select count("EsnsVmas".*) from "EsnsVmas" e2 where 
     e2."shipped" = false AND e2."VmaId" = "Vmas".id AND e2."approved" = 
     true AND "EsnsVmas".id = e2.id) as "shippedUnits", "Vmas".*, "Vendors"."name" as "name", "EsnsVmas".id as  
     "OrderItemId", "PurchaseOrderItems"."price", "Grades"."name" as "vendorGrade", 
     "Items"."name" as "model", "Items".id as "ItemId", "Grades".id as "GradeId" 
FROM "Vmas" 
     JOIN "EsnsVmas" on ("EsnsVmas"."VmaId" = "Vmas".id) 
     JOIN "Esns" on ("EsnsVmas"."EsnId" = "Esns".id) 
     JOIN "PurchaseOrderItems" on ("Esns"."PurchaseOrderItemId" = 
      "PurchaseOrderItems".id) 
     JOIN "Items" on ("PurchaseOrderItems"."ItemId" = "Items".id) 
     JOIN "Grades" on ("PurchaseOrderItems"."GradeId" = "Grades".id) 
     JOIN "Vendors" on ("Vmas"."VendorId" = "Vendors".id) 
WHERE "Vmas".id =2 AND "EsnsVmas"."approved" = true 
GROUP BY "Vmas".id, "PurchaseOrderItems".id, "Grades".id, "Items".id, "Vendors".id, "EsnsVmas".id ; 

这改变了两件事情。首先是在子查询结束时与"EsnsVmas".id = e2.id关联(我将子查询中的EsnsVmas表别名为e2)。另一件事是改变e2."VmaId" = "Vmas".id(而不是硬编码为2),它不应该影响输出,但允许你只在一个地方改变id。

+0

是的,非常感谢你。最后一件事。如果计数为0,我如何获得shipmentUnits = 0 – user1175817

+0

其硬编码为2,但实际上该编号是动态生成的 – user1175817

+0

如果没有记录返回,计数函数应返回0。但是,如果不是这样,你可以尝试去0 +(select ...)强制它为一个数字,或者使用case语句来匹配你正在接收的数据,并在这种情况下返回0。 http://www.postgresql.org/docs/9.1/static/functions-conditional.html其中一个应该工作。 – jcern