2012-06-22 58 views
7

OK - Tôi đã xem và xem và tìm thấy rất nhiều ví dụ nhưng không có gì đáp ứng được nhu cầu của tôi. Có lẽ tôi đã sử dụng những từ sai để tìm kiếm, nhưng tôi có thể sử dụng sự giúp đỡ của bạn. Tôi sẽ cung cấp càng nhiều chi tiết càng tốt.Cách xóa hàng trùng lặp khỏi tuyên bố công đoàn

Tôi cần tạo báo cáo hợp nhất các trường từ hai bảng, hoặc thay vì chế độ xem và bảng, thành một bảng cho báo cáo. Đây là tuyên bố Tôi đang sử dụng:

SELECT A.ConfInt, A.Conference, 
     NULL as Ordered, 
     NULL as Approved, 
     NULL as PickedUp, 
     SUM(dbo.Case_Visit_Payments.Qty) AS Qty 
FROM   dbo.Conferences as A INNER JOIN 
         dbo.Case_Table ON A.ConfInt = dbo.Case_Table.Conference_ID INNER JOIN 
         dbo.Case_Visit_Payments ON dbo.Case_Table.Case_ID = dbo.Case_Visit_Payments.Case_ID 
WHERE  (dbo.Case_Visit_Payments.Item_ID = 15 AND A.ProjectCool = 1) 
GROUP BY A.Conference, A.ConfInt 
UNION 
SELECT B.ConfInt, 
     B.Conference, 
     SUM(dbo.Cool_Fan_Order.NumberOfFansRequested) AS Ordered, 
     SUM(dbo.Cool_Fan_Order.Qty_Fans_Approved) AS Approved, 
     SUM(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) AS PickedUp, 
     NULL AS Qty 
FROM   dbo.Conferences as B LEFT OUTER JOIN 
         dbo.Cool_Fan_Order ON B.ConfInt = dbo.Cool_Fan_Order.Conference_ID 
where B.ProjectCool = 1 
GROUP BY B.Conference, B.ConfInt 

Và đây là kết quả:

4 Our Lady  NULL NULL NULL 11 
4 Our Lady  40  40  40  NULL 
7 Holy Rosary  20  20  20  NULL 
11 Little Flower NULL NULL NULL 21 
11 Little Flower 5  5  20  NULL 
19 Perpetual Help NULL NULL NULL 2 
19 Perpetual Help 20  20  20  NULL 

gì tôi mạnh mẽ sẽ thích là không có các hàng sao chép, chẳng hạn như:

4 Our Lady  40  40  40  11 
7 Holy Rosary  20  20  20  NULL 
11 Little Flower 5  5  20  21 
19 Perpetual Help 20  20  20  2 

Tôi hy vọng câu hỏi này là đủ rõ ràng. Bất kỳ đề xuất sẽ được đánh giá rất cao. Và tôi đánh dấu là đã trả lời. :)

Gregory

Trả lời

5

Câu trả lời nhanh chóng là để bọc truy vấn của bạn bên nhau,

SELECT ConfInt 
    , Conference 
    , SUM(Ordered) AS Ordered 
    , SUM(Approved) As Approved 
    , SUM(PickedUp) AS PickedUp 
    , SUM(Qty) AS Qty 
    FROM (

     <your UNION query here> 

    ) 
GROUP BY ConfInt, Conference 

Đây không phải là cách duy nhất để đạt được tập kết quả, nhưng đó là cách khắc phục nhanh nhất để đáp ứng các yêu cầu được chỉ định.

Là một thay thế, tôi tin rằng các truy vấn này sẽ trả về kết quả tương đương:

Chúng ta có thể sử dụng một subquery tương quan trong danh sách SELECT để lấy Số lượng:

;WITH q AS 
     (SELECT B.ConfInt 
      , B.Conference 
      , SUM(o.NumberOfFansRequested) AS Ordered 
      , SUM(o.Qty_Fans_Approved) AS Approved 
      , SUM(o.Qty_Fans_PickedUp) AS PickedUp 
      FROM dbo.Conferences as B 
      LEFT 
      JOIN dbo.Cool_Fan_Order o ON o.Conference_ID = B.ConfInt 
     WHERE B.ProjectCool = 1 
     GROUP BY B.ConfInt, B.Conference 
    ) 
SELECT q.ConfInt 
     , q.Conference 
     , q.Ordered 
     , q.Approved 
     , q.PickedUp 
     , (SELECT SUM(v.Qty) 
      FROM dbo.Case_Table t 
      JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID 
      WHERE t.Conference_ID = q.ConfInt 
      AND v.Item_ID = 15 
     ) AS Qty 
    FROM q 
    ORDER BY q.ConfInt, q.Conference 

Hoặc chúng ta có thể sử dụng Thao tác LEFT JOIN trên hai truy vấn, chứ không phải là UNION. (Chúng ta biết rằng truy vấn tham chiếu đến Cool_Fan_Order có thể là bên trái của phép nối ngoài, vì chúng ta biết rằng nó trả về ít nhất là nhiều hàng như một truy vấn khác (Về cơ bản, chúng ta biết rằng truy vấn kia không thể trả về các giá trị của ConfInt và Hội nghị mà không phải là trong truy vấn Cool_Fan_Order.)

;WITH p AS 
     (SELECT A.ConfInt 
      , A.Conference 
      , SUM(v.Qty) AS Qty 
      FROM dbo.Conferences as A 
      JOIN dbo.Case_Table t ON t.Conference_ID = A.ConfInt 
      JOIN dbo.Case_Visit_Payments v ON v.Case_ID = t.Case_ID 
     WHERE A.ProjectCool = 1 
      AND v.Item_ID = 15 
     GROUP BY A.ConfInt, A.Conference 
    ) 
    , q AS 
     (SELECT B.ConfInt 
      , B.Conference 
      , SUM(o.NumberOfFansRequested) AS Ordered 
      , SUM(o.Qty_Fans_Approved) AS Approved 
      , SUM(o.Qty_Fans_PickedUp) AS PickedUp 
      FROM dbo.Conferences as B 
      LEFT 
      JOIN dbo.Cool_Fan_Order o ON B.ConfInt = o.Conference_ID 
     WHERE B.ProjectCool = 1 
     GROUP BY B.ConfInt, B.Conference 
    ) 
SELECT q.ConfInt 
     , q.Conference 
     , q.Ordered 
     , q.Approved 
     , q.PickedUp 
     , p.Qty 
    FROM q 
    LEFT 
    JOIN p ON p.ConfInt = q.ConfInt AND p.Conference = q.Conference 
    ORDER BY q.ConfInt, q.Conference 

sự lựa chọn giữa những ba (tất cả họ đều trả về một resultset tương đương dưới tất cả các điều kiện ở), nắm để dễ đọc và bảo trì, và hiệu suất. Mở rowsets đủ lớn , có thể có một số khác biệt về hiệu suất quan sát được giữa ba câu lệnh

+0

Truy vấn con tương quan đã thực hiện thủ thuật. Nó hoạt động hoàn hảo. Cảm ơn nhiều. –

+0

BTW: Biểu thức bảng chung không bắt buộc đối với câu lệnh với truy vấn con tương ứng trong danh sách SELECT; CTE có thể dễ dàng được thay thế bằng một khung nhìn nội tuyến (trong mệnh đề FROM), đó là những gì chúng ta cần làm nếu đây là MySQL. – spencer7593

6

bạn có thể sử dụng truy vấn thực tế của bạn như một subquery, sử dụng một chức năng tổng hợp (MAX HOẶC SUM) trên giá trị và tổ chức phi nhân đôi của bạn bằng các cột không tổng hợp

SELECT ConfInt, Conference, MAX(Ordered), MAX(Approved), MAX(PickedUp), MAX(Qty) 
FROM (<your actualQuery>) 
GROUP BY ConfInt, Conference. 
+0

Điều này làm việc sau khi tôi đã chỉnh sửa một chút. Tôi đã phải xác định lựa chọn của bạn như một bảng để làm cho nó đi. CHỌN x.ConfInt, x.Conference, MAX (x.Ordered) như Đã đặt hàng, MAX (x.Approved) dưới dạng Được chấp thuận, MAX (x.PickedUp) dưới dạng PickedUp, MAX (x.Số lượng) với số lượng FROM () x GROUP BY x.Conference, x.ConfInt –

0

Tôi chỉ muốn tham gia vào Cool_Fan_Order trong lần đầu tiên chọn và loại bỏ công đoàn.

Điều này có trả về cùng kết quả không?

select 
     A.ConfInt, 
     A.Conference, 
     sum(dbo.Cool_Fan_Order.NumberOfFansRequested) as Ordered, 
     sum(dbo.Cool_Fan_Order.Qty_Fans_Approved) as Approved, 
     sum(dbo.Cool_Fan_Order.Qty_Fans_PickedUp) as PickedUp, 
     sum(sub.Qty) as Qty 
    from 
     dbo.Conferences as A 
     left outer join 
     (
      select 
       c.ConfInt, 
       cvp.Qty 
      from dbo.Conferences c 
       inner join dbo.Case_Table ct 
        on a.confInt=ct.Conference_ID 
       inner join dbo.Case_Visit_Payments cvp 
        on ct.Case_ID=cvp.Case_ID 
      where cvp.Item_ID=15 
     ) sub 
      on a.ConfInt=sub.ConfInt 
     left outer join dbo.Cool_Fan_Order 
      on A.ConfInt = dbo.Cool_Fan_Order.Conference_ID 
    where 
     (
     A.ProjectCool = 1 
     ) 
    group by 
     A.Conference, 
     A.ConfInt 
+0

Điều này không trả về cùng kết quả. Bộ lọc chỉ lọc xuống các bản ghi được tìm thấy cho Case_Visit_Payments. –

+0

Vâng, tôi đã quá lười biếng. Những gì bạn nên làm là di chuyển logic cho các trường hợp công cụ cho một truy vấn phụ. Điều này sẽ làm việc theo lý thuyết. – DForck42

+0

"Về lý thuyết không có sự khác biệt giữa lý thuyết và thực hành. Trong thực tế có." - Yogi Berra – spencer7593

Các vấn đề liên quan