2016-07-17 11 views
0

I-Ausgang von zwei Abfragen zusammenführen möchten -Gruppierung mit Union verursacht Fehler

select top(10) hex_code from dbo.colors 

Ausgang -

+----------+ 
| hex_code | 
+----------+ 
| #2ecc71 | 
| #3498db | 
| #9b59b6 | 
| #f1c40f | 
| #e67e22 | 
| #e74c3c | 
| #2980b9 | 
| #2c3e50 | 
| #27ae60 | 
| #f39c12 | 
+----------+ 

Abfrage -

SELECT top(10) [Product], count([Product]) as Count 
    FROM [dbo].[TableA] group by [Product] order by count([Product]) desc 

Ausgang -

+---------+-------+ 
| Product | Count | 
+---------+-------+ 
| A  | 105 | 
| B  | 99 | 
| C  | 87 | 
| D  | 75 | 
| E  | 56 | 
| F  | 52 | 
| G  | 37 | 
| I  | 18 | 
| K  | 16 | 
| L  | 15 | 
+---------+-------+ 

Ich habe versucht, UNION zu verwenden, um die Ausgabe zusammenzuführen, aber die Gruppierung nach Klausel lässt mich nicht. Ich bin mir nicht sicher, wie ich es mit der Klausel GROUP BY und ORDER BY verwenden soll.

Ich versuchte -

SELECT top(10) [Product], count([Product]) as Count 
    FROM [dbo].[TableA] group by [Product] order by count([Product]) desc 
UNION 
    select top(10) hex_code from dbo.colors 

Aber dies führt zu Fehler. Gibt es eine andere Möglichkeit, diese beiden Spalten zusammenzuführen?

EDIT - Erwartete Ausgabe

+---------+-------+----------+ 
| Product | Count | Hex Code | 
+---------+-------+----------+ 
| A  | 105 | #2ecc71 | 
| B  | 99 | #3498db | 
| C  | 87 | #9b59b6 | 
+---------+-------+----------+ 
for all 10 rows. 

Mit ScaisEdge Antwort, kommt das heraus wie

A 105 #27ae60 
A 105 #2980b9 

Hinweis - Beide Säulen holen Top-10-Datensätze. Beide Tabellen sind nicht verwandt. (Nein beitritt, nehme ich an)

+0

Wenn Sie eine Vereinigung tun müssen Sie die gleiche Anzahl der Spalten in jeder Abfrage. Ihre erste gibt 2 Spalten zurück und die zweite gibt nur 1 zurück. (Union in SQL bedeutet nur das Stapeln von Ergebnissen) – Massanu

+0

Wenn Bot-Tabellen nicht verwandt sind, wie lautet die Logik zum Anzeigen von Hex-Code (# 2ecc71) für Produkt A – TheGameiswar

+0

Die Ausgabe ist weiter an eine JS-Bibliothek weitergegeben, die dritte Spalte als Farbwert erwartet. –

Antwort

0

Wenn beliebig, Sie können dies tun ..

;With cte 
    as 
    (
    SELECT top(10) [Product], count([Product]) as Count 
     FROM [dbo].[TableA] group by [Product] order by count desc 
    ) 
    ,cte1 
    as(
     select top 10 hex_code from dbo.colors 
    ) 
    select * from cte c 
    cross apply 
    (select top 1 hex_code from cte1 order by newid() 
    )b 
+0

Ihre Abfrage weist nur eine Farbe zu. Wenn ich "Top 1" zu "Top 10" ändere, erhalte ich die gleiche Ausgabe wie ScaisEdge –

+0

Das ist, was wir willkürlich in begrenzten Mengen von Werten bekommen, können Sie eine rowumber auf Bot-Abfragen und verbinden sie beide – TheGameiswar

2

Sie müssen die beiden Tabellen/Abfragen join. Wenn Sie nicht über eine Spalte auf beizutreten, und Sie wollen einfach nur die jedes Produkt auf eine beliebige Farbe übereinstimmen, können row_number() anschließen konnte, so etwas wie:

select p.Product, p.Count, c.hex_code 
from (
    SELECT top(10) 
     [Product], count([Product]) as Count, 
     row_number() over (order by count([Product])) [rn] 
    FROM [dbo].[TableA] 
    group by [Product] 
) p 
left join (
    select top(10) 
     hex_code, 
     row_number() over (order by hex_code) [rn] 
    from dbo.colors 
) on p.rn=c.rn 
order by p.Count desc