2012-09-27 4 views
0

아래에이 조인 쿼리가 있습니다. 나는 그것에 하나의 문제가있다. 배송 된 단위 열이 잘못 나옵니다. 단지 총 항목 수입니다. 문제는 배송 된 필드를 제외한 모든 항목이 공통적 인 두 세트의 개체를 계산하는 것입니다.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

shippedUnits와 외부 쿼리에 대한 쿼리 간에는 관계가 없습니다. 즉, 모든 행에서 동일한 값을 생성합니다. 그것이 그것이하기로되어있는 것입니까? 또는 하위 쿼리가 행마다 달라지기로되어 있습니까? – 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 ; 

이 두 가지를 변경했습니다. 첫 번째는 subselect의 끝에서 "EsnsVmas".id = e2.id으로 다시 관련되었습니다 (하위 선택의 EsnsVmas 테이블을 e2으로 앨리어싱 함). 다른 하나는 e2."VmaId" = "Vmas".id (2로 하드 코딩하는 대신)을 변경하여 출력에 영향을 미치지 않아야하지만 한 곳에서만 ID를 변경할 수 있습니다.

+0

네, 대단히 감사합니다. 마지막 한가지. 카운트가 0 일 때 = 0을 얻으려면 어떻게해야합니까? – user1175817

+0

2로 하드 코딩되었지만 실제 숫자가 동적으로 생성됩니다 – user1175817

+0

레코드가 반환되지 않으면 카운트 함수는 0을 반환해야합니다. 하지만, 그렇지 않은 경우 0 + (select ...)를 사용하여 숫자를 강제로 입력하거나 case 문을 사용하여 수신중인 내용과 일치시키고 그 경우 0을 반환 할 수 있습니다. http://www.postgresql.org/docs/9.1/static/functions-conditional.html이 두 가지 중 하나가 작동해야합니다. – jcern