2016-11-20 5 views
0

berechnen Wenn ich einen De-normalisierte Tabelle wie folgt aus:Wie Zeilen mit Nullwerten in TPH fusionieren und abhängige Felder

FinanceList (NetSales,Expenses,Receivables,...etc,Discriminator) 

Und ich habe eine andere Tabelle (PeriodType), die ich das Jahr kategorisieren auf zwei Methoden:

  • Quarter (4 Perioden)

    1- Period1 Von Jan zu Mar

    2- Period2 Von April bis Juni

    3- Period3 Von Juli bis September

    4- Period4 Von Oktober bis Dezember

  • Yearly (1 Punkt) Von Januar bis Dezember

enter image description here


SAMPLE DATA:

Year per TypeId NetSales Expenses Receivables CompanyId 
2016 2 2 164547.0000 NULL  NULL  3001 
2016 2 2 NULL   NULL  50601.0000 3001 
2016 2 2 NULL   550.4110 NULL  3001 
2016 3 2 222764.0000 NULL  NULL  3001 
2015 3 2 264843.0000 NULL  NULL  3001 
2015 2 2 NULL   NULL  42049.0000 3001 
2015 1 3 NULL   NULL  32431.0000 3001 
2015 2 2 NULL   614.6200 NULL  3001 
2015 2 2 187112.0000 NULL  NULL  3001 
2014 1 3 NULL   NULL  28033.0000 3001 
2016 3 2 502757.0000 NULL  NULL  3002 
2016 3 2 NULL   NULL  56407.0000 3002 
2016 2 2 429821.0000 NULL  NULL  3002 
2016 2 2 NULL   516.0000 NULL  3002 
2016 2 2 NULL   NULL  70724.0000 3002 
2015 2 2 NULL   6092.0000 NULL  3002 
2015 2 2 NULL   NULL  96377.0000 3002 
2015 2 2 598416.0000 NULL  NULL  3002 
2015 3 2 677026.0000 NULL  NULL  3002 
2015 3 2 NULL   NULL  NULL  3002 
2015 1 3 NULL   NULL  92406.0000 3002 
2014 1 3 NULL   NULL  84243.0000 3002 

Jetzt stehen i zwei Probleme:

  • Weil ich TPH (viele Nullen sind) folgen, so möchte ich alle Reihen fusionieren die haben das gleiche (year,period,periodTypeId) für jede Firma in einer Reihe .

EX: Statt drei Zeilen, eine für jede Tabelle (Typ):

2016 2 2 164547.0000 NULL  NULL  3001 
    2016 2 2 NULL   NULL  50601.0000 3001 
    2016 2 2 NULL   550.4110 NULL  3001 

    2015 2 2 NULL   NULL  42049.0000 3001 
    2015 2 2 NULL   614.6200 NULL  3001 
    2015 2 2 187112.0000 NULL  NULL  3001 

Ich möchte eine Zeile wie folgt aus:

2016 2 2 164547.0000 550.4110 50601.0000 3001 
    2015 2 2 187112.0000 614.6200 42049.0000 3001 
  • Wenn ich will, eine bekommen Gleichung, die wie folgt berechnet

(The accumulated number of days in the quarter (90 or 180 0r 270 or 360)/(NetSales/((Receivables in the specific quarter + Receivables in the previous yearly year)/2))

So zum Beispiel wenn mögen (3001) Firma in den period2 of quarter diese Gleichung calc es so sein wird:

180/(164547.0000/((50601.0000 +32431.0000)/2)) =45 (for year 2016) 
180/(187112.0000/((42049.0000 +28033.0000)/2)) =34 (for year 2015) 

Meine Frage:

SELECT a.[Year],d.period,d.PeriodTypeId, a.NetSales,a.Expenses,a.Receivables, 
c.CompanyId 
FROM FinanceList a INNER JOIN Company c 
ON a.CompanyId = c.CompanyId 
INNER JOIN ListPeriod d 
ON d.FinanceListId = a.FinanceListId 
WHERE a.[Year] IN (2016,2015) AND d.PeriodTypeId IN(2,3) --The User Enter only Two Years ,PeriodTypeId ==>2 means quarter ,3 means yearly 
ORDER BY c.CompanyId, a.[Year] DESC 

Ich möchte Endergebnis ähnliche Zwei Datensätze für jede Firma:

Year per TypeId NetSales  Expenses Receivables CompanyId equation 
2016 2 2  164547.0000 550.4110 50601.0000 3001  45 
2015 2 2  187112.0000 614.6200 42049.0000 3001  34 

Antwort

1

Ich denke, das durch Aggregationsfunktionen realisiert werden können. Verwenden Sie einen allgemeinen Tabellenausdruck, um die gesuchten Zeiträume und Jahre sowie die vorherigen Jahre auszuwählen. Verarbeiten Sie die zurückgegebenen Daten für das Ergebnis und die Berechnungen. Hinweis: Ich habe folgende Abfrage nur syntaktisch getestet.

WITH data AS (
    SELECT a.[Year], 
     d.period, 
     d.PeriodTypeId, 
     SUM(a.NetSales) AS NetSales, 
     SUM(a.Expenses) AS Expenses, 
     SUM(a.Receivables) AS Receivables, 
     c.CompanyId 
    FROM FinanceList a 
     INNER JOIN Company c 
       ON a.CompanyId = c.CompanyId 
     INNER JOIN ListPeriod d 
       ON d.FinanceListId = a.FinanceListId 
    WHERE a.[Year] IN (2016, 2015) AND d.PeriodTypeId IN(2, 3) 
     OR a.[Year] IN (2016 - 1, 2015 - 1) AND d.PeriodTypeId = 3 -- previous years 
    GROUP BY a.[Year], d.period, d.PeriodTypeId, c.CompanyId 
) 
SELECT [Year], 
     period, 
     PeriodTypeId, 
     NetSales, 
     Expenses, 
     Receivables, 
     CompanyId, 
     CASE 
     WHEN PeriodTypeId = 2 
     THEN (period * 90)/(NetSales/((Receivables + (SELECT Receivables 
                  FROM data T2 
                  WHERE T2.[Year]  = T1.[Year] - 1 
                   AND T2.period  = 1 
                   AND T2.PeriodTypeId = 3 
                   AND T2.CompanyId = T1.CompanyId) /* Receivables previous year */)/2)) 
     ELSE NULL 
     END AS equation 
    FROM data T1 
WHERE [Year] IN (2016, 2015) AND PeriodTypeId IN(2, 3) 
ORDER BY CompanyId, [Year] DESC 
+0

Ich benutze 'MIN' anstelle von' SUM' –

Verwandte Themen