Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie SQL — wzrost sprzedaży rok po roku

Wypróbuj to zapytanie:

SELECT t1.tenant, t1.YEAR, t1.SALES,
    CASE WHEN t2.YEAR IS NOT NULL THEN
        FORMAT(
            CONVERT(DECIMAL(10, 2), (t1.SALES - t2.SALES)) /
            CONVERT(DECIMAL(10, 2), t2.SALES), 'p')
    ELSE NULL END AS "YEARLY GROWTH"
FROM
(
    SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
    FROM tenantSales
    GROUP BY tenant, YEAR(date)
) t1
LEFT JOIN
(
    SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
    FROM tenantSales
    GROUP BY tenant, YEAR(date)
) t2
ON t1.tenant = t2.tenant AND t2.YEAR = t1.YEAR - 1

Kliknij poniższy link, aby zobaczyć działające demo:

SQLFiddle

Późna aktualizacja:

Możesz również wypróbować to samo podejście, używając wspólnych wyrażeń tabel. Oto jak wyglądałoby powyższe zapytanie przy użyciu tego podejścia:

WITH cte AS(SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
            FROM tenantSales
            GROUP BY tenant, YEAR(date))
SELECT c1.*, CONVERT(varchar,
                 CONVERT(DECIMAL(10,2),
                     CONVERT(DECIMAL(10, 2), (c1.SALES - c2.SALES)) /
                     CONVERT(DECIMAL(10, 2), c2.SALES))) + '%' AS "YEARLY GROWTH"
FROM cte c1
LEFT JOIN cte c2 ON c1.tenant = c2.tenant AND c2.YEAR = c1.YEAR - 1

A oto kolejne skrzypce, na których możesz to przetestować:

SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykorzystanie procesora przez bazę danych?

  2. Utwórz procedurę składowaną w SQL Server 2017

  3. Zapytanie SQL do pobrania średnich wartości dla jednodniowej przerwy między klientami

  4. Jak uzyskać dane z ostatnich 7 dni od aktualnej daty i godziny do ostatnich 7 dni na serwerze sql?

  5. jak podzielić i wstawić dane CSV do nowej tabeli w jednym oświadczeniu?