2016-08-24 3 views
0

Ich habe zwei Abfragen. Eine Abfrage ruft die Informationen basierend auf den Bestellungen ab, die an einem Tag für den Mitarbeiter geplant wurden. Die andere Abfrage zieht die Anzahl der Aufträge, die an einem Tag abgeschlossen und bezahlt wurden, zusammen mit dem Gesamtbetrag der Einnahmen aus den Aufträgen.So verbinden Sie zwei ausgewählte Abfragen in SQL Server 2012

Ich habe die Foren ausgekratzt, um den Code zusammen zu bekommen, um diese Abfragen zu bekommen, aber ich muss beide Abfragen zusammengefügt haben. Ich möchte diese Informationen in Report Builder verwenden, sobald ich es fertig habe. Es ist wahrscheinlich einfach für jemanden, aber es verwirrt mich, da ich weit entfernt von jeder Art von Experten mit SQL bin.

Ich brauche nur einen Tag im Moment, habe aber diesen Code gefunden und für den Moment modifiziert und hoffe, dass ich ihn in Zukunft nutzen kann, wenn ich Wochen- und Monatsdaten benötige.

Jede Hilfe wäre willkommen.

Abfrage 1

declare @dt DATE = '20160823' 
set DATEFIRST 7; 
set @dt = dateadd(week, datediff(week, '19050101', @dt), '19050101'); 

;with dt as 
(
    select 
     Technician = (CASE emp_id 
         WHEN 'CW697' THEN 'Joe Biggs' 
         WHEN 'DZ663' THEN 'Mimi Cassidy' 
         END), 
     dw = datepart(weekday, DATE) 
    from 
     dbo.ordemps 
    where 
     date >= @dt and date <dateadd(day, 7, @dt) 
), 
x AS 
(
    select 
     Technician, dw = coalesce(dw,8), 
     c = convert(varchar(11), COUNT(*)) 
    from 
     dt 
    group by 
     grouping sets((Technician), (Technician,dw)) 
) 
select 
    Technician, 
    [Sun] = coalesce([1], '-'), 
    [Mon] = coalesce([2], '-'), 
    [Tue] = coalesce([3], '-'), 
    [Wed] = coalesce([4], '-'), 
    [Thu] = coalesce([5], '-'), 
    [Fri] = coalesce([6], '-'), 
    [Sat] = coalesce([7], '-'), 
    TOTAL =[8] 
from 
    x 
PIVOT 
    (MAX(c) FOR dw IN([1],[2],[3],[4],[5],[6],[7],[8])) as pvt; 

Abfrage 2

select 
    case 
     when grouping(d.m)=15 then 'Year ' + cast(max(d.y) as varchar(10)) 
     when grouping(date)=15 then datename(m, max(DATE)) + ' ' + cast(max(d.y) as varchar(10)) 
     else cast(cast([date] as date) as varchar(255)) 
    end as DATE, 
    TotalOrders = /*sum(Amount)*/convert(varchar(11), COUNT(*)), 
    TotalSales = sum(Amount), 
    Technician = (CASE recv_by 
        WHEN 'CW697' THEN 'Joe Biggs' 
        WHEN 'DZ663' THEN 'Mimi Cassidy' 
        END) 
from 
    ordpay 
cross apply 
    (select 
     datepart(yy, [date]), 
     datepart(m, [date]) 
    ) d(y, m) 
where 
    [DATE] >= dateadd(day, datediff(day, 1, getdate()), 0) 
    and [date] < dateadd(day, datediff(day, 0, getdate()), 0) 
group by 
    recv_by, d.y, rollup (d.m, date) 
order by 
    d.y desc, grouping(d.m), d.m, grouping(DATE), DATE 
+4

Willkommen bei Stackoverflow (SO)! So gerne wir uns gegenseitig helfen, sind wir kein Code-Writing-Service. Machen Sie sich etwas Mühe und versuchen Sie es herauszufinden. Wenn Sie Probleme haben, dann bitten Sie um Hilfe. Oft werden diese Fragen geschlossen, da keine Probleme auftreten und der Aufwand für die Frage nicht ausreichend angezeigt wird. Wir tun dies nicht, um gemein oder grausam zu sein, sondern weil diejenigen, die diesen Code schreiben/pflegen, sich Mühe geben sollten und andere für diese Art von Arbeit bezahlt werden! – xQbert

+0

Es tut mir leid, wenn ich rüber kam, als ob ich einfach jemanden bat, Software für mich zu schreiben. Ich habe über einen Tag daran gearbeitet, um es herauszufinden. Ich habe hier zahlreiche Beiträge gelesen und habe noch nicht begriffen, was gebraucht wird. Also habe ich mich entschieden, auch hier eine Frage zu stellen, nachdem ich einen Tag mit dem Kopf geschlagen habe. – mistrfree

+1

Es wird viel einfacher, wenn Sie einen Code zum Generieren von Eingabedaten bereitstellen und uns mitteilen, was das erwartete Ergebnis ist. Fügen Sie einfach eine create-Tabelle und einige insert-Anweisungen hinzu, um daraus Beispieldaten zu generieren.Übrigens denke ich, dass es eine gültige Frage sein kann und es wert ist, daran zu arbeiten. – FLICKER

Antwort

2

Am einfachsten Ebene Sie Unter Join-Abfragen verwenden können, können. Ihr Beispiel ist etwas komplizierter, weil Sie CTEs verwenden, die nicht in die Unterabfrage aufgenommen werden können. Um Sie in die richtige Richtung es in der Regel wie folgt aussehen sollte:

with cte1 as(), 
cte2 as() 
select * 
from (
    select * 
    from tables 
    where criteria -- subquery 1 (cannot contain order by) 
) a 
join ( -- could be a left join 
    select * 
    from tables 
    where criteria -- subquery 2 (cannot contain order by) 
) b 
on b.x = a.x --join criteria 
where --additional criteria 
order by --final sort 

wo subquery 1 Ihre Abfrage 1 von select Technician bis zum Ende sein würde und subquery 2 wäre alles aus der Abfrage 2 mit Ausnahme der order by.

Weitere Informationen zu Verknüpfungen finden Sie in der Dokumentation MSDN

+0

Danke für die Tipps. Das führt mich in die richtige Richtung. Ich muss noch ein paar Anpassungen vornehmen, aber deine Tipps haben mir wirklich geholfen. – mistrfree

0

Da Sie nicht viel erforschen werden es nicht hier scheint eine klobig und schnelle Art und Weise, und hält es einfach für Sie, ohne erklären zu müssen, viel, wenn wir die Abfragen zusammen eleganter verbinden würden.

Der erste Satz von Code verfügt über 2 allgemeine Tabellenausdrücke (CTE). Wählen Sie also diese Ergebnisse in eine Temp. Beachten Sie die --addition hier

.... 
select 
    Technician, 
    [Sun] = coalesce([1], '-'), 
    [Mon] = coalesce([2], '-'), 
    [Tue] = coalesce([3], '-'), 
    [Wed] = coalesce([4], '-'), 
    [Thu] = coalesce([5], '-'), 
    [Fri] = coalesce([6], '-'), 
    [Sat] = coalesce([7], '-'), 
    TOTAL =[8] 
into #someTemp      --Addition here 
from 
.... 

Machen Sie dasselbe für die zweite Abfrage ...

... 
into #someOtherTemp     --Addition here 
from 
    ordpay 
... 

Dann kommen sie togehter ...

select t1.someColumns, t2.someOtherColumns 
from #someTemp t1 
inner join #someOtherTemp t2 on t1.column = t2.column 
Verwandte Themen