2013-03-05 13 views
20

Ho due domande: query semplificate escluso unisceCome combinare i risultati di due query in un singolo set di dati

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

Vorrei sapere come posso ottenere un output come:

ProductName NumberofProducts(in inventory) ProductName NumberofProductsSold 

Le relazioni utilizzate per ottenere gli output per ogni query sono diverse. Ho bisogno dell'output in questo modo per il mio rapporto SSRS.

(ho provato la dichiarazione dell'Unione, ma doesnt lavoro per l'uscita che voglio vedere.)

+0

Riesci a dare l'esempio di ciò che è in Table1 e Table2 e quale dovrebbe essere l'output atteso? – cadrell0

+1

Quanti risultati vengono restituiti dalle query. Se multiplo, qual è la logica per mettere ('col1',' col2) 'sulla stessa riga con (' col3', 'col4')? –

+0

Ho semplificato le mie query sopra. Posso darti un esempio delle mie domande. Query 1 restituisce Col1: ProductName e Col2: NumberofProducts nell'inventario. Query 2 restituisce Col3: ProductName e Col4: NumberofProductsSold – CodeNinja

risposta

2

Se vuoi dire che entrambi i ProductName i campi devono avere lo stesso valore, allora:

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

oppure, se si vuole che la colonna ProductName da visualizzare solo una volta,

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

Altrimenti, se qualsiasi riga di Tabella 1 può essere associato a qualsiasi riga da Table2 (anche t veramente mi chiedo davvero perché qualcuno volesse farlo), potresti dare un'occhiata a this.

35

Ecco un esempio che fa l'unione tra due tabelle completamente indipendenti: lo studente e la tabella Products. Esso genera un output che si trova a 4 colonne:

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 

Ovviamente avrete ottimizzare questo per il proprio ambiente ...

+0

uguale alla mia risposta ma marginalmente più veloce, +1 – Jodrell

+0

@GojiraDeMonstah! Grazie! ma questo metodo mi dà alcuni inserimenti NULL extra nell'output risultante. – CodeNinja

+0

Bene, l'esempio che ho usato aveva alcuni null intenzionalmente per illustrare come una tabella potrebbe causare "buchi" nei dati. Tuttavia, se non si desidera visualizzare i valori null, è possibile sostituirli nell'esempio con i nomi effettivi delle colonne o fornire un valore predefinito, ad es. ISNULL (MaxQty, 0,00). – GojiraDeMonstah

8

ne dite,

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

Il problema è che a meno che le tabelle sono correlati non è possibile determinare come unirsi a loro, quindi dovresti unirli arbitrariamente, risultante in un prodotto cartesiano:

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

Se avete avuto, per esempio, i seguenti dati:

col1 col2 
a  1 
b  2 

col3 col4 
y  98 
z  99 

si finirebbe con il seguente:

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

E 'questo quello che stai cercando? In caso contrario, e si dispone di alcuni mezzi di relative tabelle, allora si sarebbe necessario includere che nei unisce le due tavoli insieme, ad esempio:

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

che tirava le cose insieme per voi in comunque i dati è correlato , dandoti il ​​tuo risultato.

+0

E, dal momento che hai modificato la tua domanda per fornirci con ProductName, possiamo presumere che useresti ProductName come campo di adesione. –

0

Prova questo:

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

penso che tu sia dopo qualcosa di simile; (Usando row_number() con CTE e l'esecuzione di un 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 

Tabelle e dati:

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) 

Risultati:

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

Questo è quello che puoi fare. Supponendo che la colonna ProductName abbia valori comuni.

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

Prova questo:

vedere la scheda PER current_month, LAST_MONTH E ALL_TIME E unirle IN singolo array

$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; 
Problemi correlati