web-dev-qa-db-fra.com

Comment combiner les résultats de deux requêtes dans un seul jeu de données

J'ai deux requêtes: Requêtes simplifiées à l'exclusion des jointures

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

Je voudrais savoir comment je peux obtenir une sortie en tant que:

ProductName NumberofProducts(in inventory)  ProductName NumberofProductsSold

Les relations utilisées pour obtenir les sorties pour chaque requête sont différentes . J'ai besoin de cette sortie pour mon rapport SSRS.

(J'ai essayé la déclaration de l'union, mais cela ne fonctionne pas pour la sortie que je veux voir.)

26
CodeNinja

Voici un exemple qui fait une union entre deux tables totalement indépendantes: la table Student et la table Products. Il génère une sortie composée de 4 colonnes:

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

Évidemment, vous allez modifier cela pour votre propre environnement ...

44
GojiraDeMonstah

Je pense que vous voulez quelque chose comme ça; (Utilisation de row_number() avec CTE et exécution d'un FULL OUTER JOIN)

Fiddle exemple

;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

Tableaux et données:

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)

Résultats :

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

Que diriez-vous,

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

Le problème est que, sauf si vos tables sont liées, vous ne pouvez pas déterminer comment les joindre. Vous devez donc les rejoindre de manière arbitraire, ce qui donne un produit cartésien:

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

Si vous aviez, par exemple, les données suivantes:

col1  col2
a     1
b     2

col3  col4
y     98
z     99

Vous vous retrouveriez avec ce qui suit:

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

Est-ce ce que vous cherchez? Si ce n’est pas le cas et que vous avez le moyen de relier les tables, vous devez inclure cela dans la réunion des deux tables, par exemple:

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

Cela rassemblerait les choses pour vous, mais les données seraient liées, vous donnant votre résultat.

2
David T. Macknet

Si vous voulez dire que les deux champs ProductName doivent avoir la même valeur, alors:

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

Ou, si vous souhaitez que la colonne ProductName ne soit affichée qu'une seule fois,

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

Sinon, si une ligne de Table1 peut être associée à une ligne de Table2 (même si je me demande vraiment pourquoi quelqu'un voudrait le faire), vous pouvez donner ceci un aspect.

2
Roney Michael

Essaye ça:

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

Chargez chaque requête dans un datatable:

http://www.dotnetcurry.com/ShowArticle.aspx?ID=143

chargez les deux tables de données dans le jeu de données:

http://msdn.Microsoft.com/en-us/library/aeskbwf7%28v=vs.80%29.aspx

0
RandomUs1r

C'est ce que tu peux faire. En supposant que votre colonne ProductName ait des valeurs communes.

SELECT 
     Table1.ProductName, 
     Table1.NumberofProducts, 
     Table2.ProductName, 
     Table2.NumberofProductssold
FROM Table1
INNER JOIN Table2
ON Table1.ProductName= Table2.ProductName
0
Praveen Nambiar