2013-03-05 34 views
20

Tôi có hai câu hỏi: Queries Giản trừ tham giaLàm thế nào để kết hợp kết quả của hai truy vấn vào một tập dữ liệu đơn

Query 1 : select ProductName,NumberofProducts (in inventory) from Table1.....; 
Query 2 : select ProductName, NumberofProductssold from Table2......; 

Tôi muốn biết làm thế nào tôi có thể nhận được một đầu ra như:

ProductName NumberofProducts(in inventory) ProductName NumberofProductsSold 

Các mối quan hệ được sử dụng để nhận kết quả đầu ra cho mỗi truy vấn khác nhau. Tôi cần đầu ra theo cách này cho báo cáo SSRS của tôi.

(Tôi đã thử các tuyên bố liên minh nhưng nó không làm việc cho đầu ra Tôi muốn nhìn thấy.)

+0

Bạn có thể cho ví dụ cho những gì có trong Table1 và Table2 và đầu ra dự kiến ​​sẽ là gì? – cadrell0

+1

Có bao nhiêu kết quả được truy vấn trả về của bạn. Nếu có nhiều thì logic đặt ('col1',' col2) 'trên cùng một dòng với (' col3', 'col4') là gì? –

+0

Tôi đã đơn giản hóa các truy vấn của mình ở trên. Tôi có thể cung cấp cho bạn một ví dụ về các truy vấn của tôi. Truy vấn 1 trả về Col1: ProductName & Col2: NumberofProducts trong khoảng không quảng cáo. Truy vấn 2 trả về Col3: ProductName & Col4: NumberofProductsSold – CodeNinja

Trả lời

2

Nếu bạn có nghĩa là cả hai ProductName các trường là có giá trị như nhau, sau đó:

SELECT a.ProductName,a.NumberofProducts,b.ProductName,b.NumberofProductsSold FROM Table1 a, Table2 b WHERE a.ProductName=b.ProductName; 

hoặc, nếu bạn muốn cột ProductName sẽ được hiển thị chỉ một lần,

SELECT a.ProductName,a.NumberofProducts,b.NumberofProductsSold FROM Table1 a, Table2 b WHERE a.ProductName=b.ProductName; 

nếu không, nếu có hàng Table1 có thể được liên kết với bất kỳ hàng từ Table2 (thậm chí t hough tôi thực sự tự hỏi tại sao bất cứ ai muốn làm điều đó), bạn có thể cung cấp cho this một cái nhìn.

35

Dưới đây là ví dụ về sự kết hợp giữa hai bảng hoàn toàn không liên quan: bảng Sinh viên và Sản phẩm. Nó tạo ra một sản lượng đó là 4 cột:

select FirstName as Column1, LastName as Column2, email as Column3, null as Column4 from Student 
union 
select ProductName as Column1, QuantityPerUnit as Column2, null as Column3, UnitsInStock as Column4 from Products 

Rõ ràng bạn sẽ tinh chỉnh này đối với môi trường của riêng bạn ...

+0

giống như câu trả lời của tôi nhưng nhanh hơn, +1 – Jodrell

+0

@GojiraDeMonstah! Cảm ơn bạn! nhưng phương pháp này cho tôi một số chèn thêm NULL trong kết quả đầu ra. – CodeNinja

+0

Vâng, ví dụ tôi đã sử dụng có một số null cố ý minh họa cách một bảng có thể gây ra "lỗ hổng" trong dữ liệu. Nhưng nếu bạn không muốn thấy các giá trị rỗng, bạn có thể thay thế chúng trong ví dụ bằng tên cột thực tế hoặc cung cấp giá trị mặc định, ví dụ: ISNULL (MaxQty, 0,00). – GojiraDeMonstah

8

Làm thế nào về,

select 
     col1, 
     col2, 
     null col3, 
     null col4 
    from Table1 
union all 
select 
     null col1, 
     null col2, 
     col4 col3, 
     col5 col4 
    from Table2; 
2

Vấn đề là trừ khi bảng của bạn có liên quan bạn không thể xác định cách tham gia cùng họ, vì vậy bạn phải tự ý tham gia cùng họ, dẫn đến một sản phẩm Descartes:

select Table1.col1, Table1.col2, Table2.col3, Table2.col4 
from Table1 
cross join Table2 

Nếu bạn đã có, ví dụ, các dữ liệu sau:

col1 col2 
a  1 
b  2 

col3 col4 
y  98 
z  99 

Bạn sẽ kết thúc như sau:

col1 col2 col3 col4 
a  1  y  98 
a  1  z  99 
b  2  y  98 
b  2  z  99 

Đây có phải là những gì bạn đang tìm kiếm? Nếu không, và bạn có một số phương tiện liên quan các bảng, sau đó bạn sẽ cần phải làm việc này trong khi tham gia hai bảng với nhau, ví dụ:

select Table1.col1, Table1.col2, Table2.col3, Table2.col4 
from Table1 
inner join Table2 
on Table1.JoiningField = Table2.JoiningField 

Điều đó sẽ kéo mọi thứ lại với nhau cho bạn vào tuy nhiên dữ liệu được liên quan , cho bạn kết quả của bạn.

+0

Và vì bạn đã chỉnh sửa câu hỏi của mình để cung cấp cho chúng tôi ProductName, chúng tôi có thể giả định rằng bạn sẽ sử dụng ProductName làm trường tham gia của mình. –

0

Hãy thử điều này:

SELECT ProductName,NumberofProducts ,NumberofProductssold FROM table1 JOIN table2 ON table1.ProductName = table2.ProductName 
18

Tôi nghĩ rằng bạn đang sau một cái gì đó như thế này; (Sử dụng row_number() với CTE và thực hiện một FULL OUTER JOIN)

Fiddle example

;with t1 as (
    select col1,col2, row_number() over (order by col1) rn 
    from table1 
), 
t2 as (
    select col3,col4, row_number() over (order by col3) rn 
    from table2 
) 
select col1,col2,col3,col4 
from t1 full outer join t2 on t1.rn = t2.rn 

Bàn dữ liệu:

create table table1 (col1 int, col2 int) 
create table table2 (col3 int, col4 int) 

insert into table1 values 
(1,2),(3,4) 

insert into table2 values 
(10,11),(30,40),(50,60) 

Kết quả:

| COL1 | COL2 | COL3 | COL4 | 
--------------------------------- 
|  1 |  2 | 10 | 11 | 
|  3 |  4 | 30 | 40 | 
| (null) | (null) | 50 | 60 | 
0

Đây là những gì bạn có thể làm. Giả sử rằng cột ProductName của bạn có các giá trị chung.

SELECT 
    Table1.ProductName, 
    Table1.NumberofProducts, 
    Table2.ProductName, 
    Table2.NumberofProductssold 
FROM Table1 
INNER JOIN Table2 
ON Table1.ProductName= Table2.ProductName 
-2

Hãy thử điều này:

GET THE RECORD CHO CURRENT_MONTH, LAST_MONTH VÀ ALL_TIME và hợp nhất chúng vào mảng SINGLE

$analyticsData = $this->user->getMemberInfoCurrentMonth($userId); 
$analyticsData1 = $this->user->getMemberInfoLastMonth($userId); 
$analyticsData2 = $this->user->getMemberInfAllTime($userId);       

    foreach ($analyticsData2 as $arr) {     
     foreach ($analyticsData1 as $arr1) { 
      if ($arr->fullname == $arr1->fullname) { 
       $arr->last_send_count = $arr1->last_send_count; 
       break; 
      }else{ 
       $arr->last_send_count = 0; 
      } 
     } 
     foreach ($analyticsData as $arr2) { 
      if ($arr->fullname == $arr2->fullname) { 
       $arr->current_send_count = $arr2->current_send_count; 
       break; 
      }else{ 
       $arr->current_send_count = 0; 
      } 
     } 
    } 
    echo "<pre>"; 
    print_r($analyticsData2);die; 
Các vấn đề liên quan