2016-07-08 12 views
2

Gibt es eine Chance Geschwindigkeit der Abfrage unten zu verbessern:Microsoft SQL-Abfrage Server verbessern

select distinct 
    a.InvoiceAcc, 
    (select top 1 b.CustomerName 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc), 
    (select sum(b.SalesValue) 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-1') as [01], 
    (select sum(b.SalesValue) 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-2') as [02], 
    (select sum(b.SalesValue) 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-3') as [03], 
    (select sum(b.SalesValue) 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-4') as [04], 
    (select sum(b.SalesValue) 
    from dbo.tblsales as b 
    where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-5') as [05], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-6') as [06], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-7') as [07], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-8') as [08], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-9') as [09], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-10') as [10], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-11') as [11], 
    (select sum(b.SalesValue) from dbo.tblsales as b where b.InvoiceAcc = a.InvoiceAcc and b.Month = '2016-12') as [12] 
from 
    dbo.tblsales as a 
group by 
    a.InvoiceAcc, CustomerName 

Was würde die Ansicht in SQL Server mit params Monat gesendet, wie 2016 und InvoiceAcc (nicht erforderlich)?

Vielen Dank.

+0

dies sollte verwenden (Fall wenn [Monat] = '2016-1' dann SalesValue sonst 0 endet) als [01], – Kostya

+0

Ich denke, das ist, was ich gesucht habe. Ich bin neu in SQL. – Maludasek

+0

@Kostya - warum hast du einen Kommentar gepostet und keine Antwort? – Hogan

Antwort

2

Basierend auf Ihrem Beispiel wollen Sie diese

select 
    InvoiceAcc, 
    CustomerName, 
    sum(CASE WHEN [Month] = '2016-1' then salesvalue else 0 end) as [01], 
    sum(CASE WHEN [Month] = '2016-2' then salesvalue else 0 end) as [02], 
    sum(CASE WHEN [Month] = '2016-3' then salesvalue else 0 end) as [03], 
    sum(CASE WHEN [Month] = '2016-4' then salesvalue else 0 end) as [04], 
    sum(CASE WHEN [Month] = '2016-5' then salesvalue else 0 end) as [05], 
    sum(CASE WHEN [Month] = '2016-6' then salesvalue else 0 end) as [06], 
    sum(CASE WHEN [Month] = '2016-7' then salesvalue else 0 end) as [07], 
    sum(CASE WHEN [Month] = '2016-8' then salesvalue else 0 end) as [08], 
    sum(CASE WHEN [Month] = '2016-9' then salesvalue else 0 end) as [09], 
    sum(CASE WHEN [Month] = '2016-10' then salesvalue else 0 end) as [10], 
    sum(CASE WHEN [Month] = '2016-11' then salesvalue else 0 end) as [11], 
    sum(CASE WHEN [Month] = '2016-12' then salesvalue else 0 end) as [12] 
from dbo.tblsales 
group by InvoiceAcc, CustomerName 

ich den Test nicht finden (zB Month = '2016-1') fremd zu sein - ich ein Datumsfeld erwarten würde und ein Test wie dieser MONTH(invoiceDate) = 1

ich auch denke, dass die Verwendung von distinct in sql oft ein Hinweis auf eine schlechte Abfrage ist - es ist selten, dass eine korrekt entworfene Abfrage von einem gut entworfenen Modell eindeutig ist.


Wenn Sie die beste Art und Weise zusätzliche Namen entfernen möchten, es zu tun, ist dies:

select 
    InvoiceAcc, 
    CustomerName, 
    sum(CASE WHEN [Month] = '2016-1' then salesvalue else 0 end) as [01], 
    sum(CASE WHEN [Month] = '2016-2' then salesvalue else 0 end) as [02], 
    sum(CASE WHEN [Month] = '2016-3' then salesvalue else 0 end) as [03], 
    sum(CASE WHEN [Month] = '2016-4' then salesvalue else 0 end) as [04], 
    sum(CASE WHEN [Month] = '2016-5' then salesvalue else 0 end) as [05], 
    sum(CASE WHEN [Month] = '2016-6' then salesvalue else 0 end) as [06], 
    sum(CASE WHEN [Month] = '2016-7' then salesvalue else 0 end) as [07], 
    sum(CASE WHEN [Month] = '2016-8' then salesvalue else 0 end) as [08], 
    sum(CASE WHEN [Month] = '2016-9' then salesvalue else 0 end) as [09], 
    sum(CASE WHEN [Month] = '2016-10' then salesvalue else 0 end) as [10], 
    sum(CASE WHEN [Month] = '2016-11' then salesvalue else 0 end) as [11], 
    sum(CASE WHEN [Month] = '2016-12' then salesvalue else 0 end) as [12] 
from (
    SELECT InvoiceAcc, CustomerName, Month, salesvalue, 
     ROW_NUMBER() OVER (PARTITION BY InvoiceAcc ORDER BY CustomerName) AS RN 
     FROM tblsales 
) x 
WHERE RN=1 
group by InvoiceAcc, CustomerName 
+0

Das Problem ist, dass Tabelle. Es wurde von jemand anderem erstellt und ist falsch konstruiert. :(Leider kann ich die Struktur nicht ändern. :(Ich werde versuchen, das Problem zu erklären. Es gibt ein zusätzliches Feld DeliveryAcc. InvoiceAcc ist eine Art Eltern für DeliveryAcc. Beispiel InvoiceAcc = X01, DeliveryAcc = X01001 und X01002. CustomerName ist ein Name für DeliveryAcc, also im Grunde, wenn ich CASE WHEN benutze, bekomme ich 2+ Zeilen mit 2+ verschiedenen Zahlen in jeder Zeile für 1 InvoiceAcc, abhängig davon, wie viele verschiedene CustomerNames für diesen InvoiceAcc sind.Ich denke, dass es dazu keine andere Möglichkeit gibt Bin ich richtig? – Maludasek

+0

@Maludasek - es gibt einen Weg - möchten Sie einige der Zeilen für eine bestimmte RechnungAcc ausschließen oder (wie mein Beispiel oben und der Code, den Sie gebucht haben) wollen Sie alle Werte für eine "InvoiceAcc? Ich werde eine Version veröffentlichen, die zusätzliche Namen entfernt. – Hogan

+0

Ihr Code oben funktioniert nicht so, wie ich es wollte. Es gibt mir mehrere Zeilen für einen RechnungAcc. :( – Maludasek

0

Sie könnten versuchen, Pivot für die Leistung Summe besser

select 
InvoiceAcc, 
CustomerName, 
[2016-1] as [01], 
[2016-2] as [02], 
[2016-3] as [03], 
[2016-4] as [04], 
[2016-5] as [05], 
[2016-6] as [06], 
[2016-7] as [07], 
[2016-8] as [08], 
[2016-9] as [09], 
[2016-10] as [10], 
[2016-11] as [11], 
[2016-12] as [12] 
from (
select 
InvoiceAcc, 
CustomerName, 
[Month], 
sum(SalesValue) SalesValue 
from dbo.tblsales 
group by InvoiceAcc, CustomerName,[Month]) tb 
pivot 
(
sum(SalesValue) 
for [Month] in ([2016-1],[2016-2] ,[2016-3],[2016-4],[2016-5],[2016-6],[2016-7],[2016-8],[2016-9],[2016-10],[2016-11],[2016-12]) 
) pvt 
Verwandte Themen