2015-11-16 96 views
0

我要做一個SQL查詢,根據它從何時開始直到當前時間,每年顯示租戶的銷售額,除非它已經不活躍。在下面給出的表格中,租戶1和2顯示其每年的銷售額。租戶1的5列,因爲它在2011年啓動,並與承租人2在2014年SQL查詢以年爲基礎動態顯示銷售額

+----------+------+-------------+ 
| TENANT | YEAR | TOTAL SALES | 
+----------+------+-------------+ 
| Tenant 1 | 2011 | 1,000  | 
| Tenant 1 | 2012 | 3,000  | 
| Tenant 1 | 2013 | 2,000  | 
| Tenant 1 | 2014 | 3,000  | 
| Tenant 1 | 2015 | 2,000  | 
| Tenant 2 | 2014 | 5,000  | 
| Tenant 2 | 2015 | 2,000  | 
+----------+------+-------------+ 

我完全失去了截至目前在做什麼,我有現成的代碼,以某種方式做同樣的,但它是靜態和不靈活的,它會顯示的年份,默認5年,並且是垂直形式。

SELECT 
    tenant 
    ,(SUM(CASE WHEN YEAR(DATE) = @Year1 THEN sales END)) AS 'Year1' 
    ,(SUM(CASE WHEN YEAR(DATE) = @Year2 THEN sales END)) AS 'Year2' 
    ,(SUM(CASE WHEN YEAR(DATE) = @Year3 THEN sales END)) AS 'Year3' 
    ,(SUM(CASE WHEN YEAR(DATE) = @Year4 THEN sales END)) AS 'Year4' 
    ,(SUM(CASE WHEN YEAR(DATE) = @Year5 THEN sales END)) AS 'Year5' 
FROM 
    TenantSales 

TenantSales表

  • 租客
  • 位置
  • 日期
  • 銷售
+0

您能否包含原始表格? –

+0

完成,已編輯 – rickyProgrammer

回答

2

你可以嘗試做的TENANT和一年GROUP BY,以達到您想要的輸出:

SELECT TENANT, YEAR(DATE), SUM(Sales) AS `TOTAL SALES` 
FROM TenantSales 
GROUP BY TENANT, YEAR(DATE) 
+0

謝謝,它的工作 – rickyProgrammer

0

一種方法是使用dynamic crosstab

SQL Fiddle

DECLARE @sql NVARCHAR(MAX) = N'' 

SELECT @sql = 
'SELECT 
    Tenant' + CHAR(10) 

SELECT @sql = @sql + 
' , SUM(CASE WHEN [Year] = ' + CONVERT(VARCHAR(4), yr) + ' THEN Sales ELSE 0 END) AS ' + QUOTENAME('Year' + CONVERT(VARCHAR(4), N)) + CHAR(10) 
FROM(
    SELECT *, 
     ROW_NUMBER() OVER(ORDER BY yr) N 
    FROM(
     SELECT DISTINCT [Year] AS yr 
     FROM TenantSales 
    ) a 
) t 
ORDER BY N 

SELECT @sql = @sql + 
'FROM TenantSales 
GROUP BY Tenant 
ORDER BY Tenant' 

PRINT @sql 
EXECUTE sp_executesql @sql 

結果:

| Tenant | Year1 | Year2 | Year3 | Year4 | Year5 | 
|----------|-------|-------|-------|-------|-------| 
| Tenant 1 | 1000 | 3000 | 2000 | 3000 | 2000 | 
| Tenant 2 |  0 |  0 |  0 | 5000 | 2000 | 
+0

不,我希望它是水平的,每行的形式。我上面發佈的代碼也能夠產生相同的輸出。 – rickyProgrammer

+1

你能發佈預期的輸出嗎? –

+0

我已經做了,這是問題先生。第一張張貼 – rickyProgrammer

0

而不是通過5單獨的參數可以傳遞一個準備好用於樞軸語句的參數。這是您從某些客戶端應用程序傳遞所需年份時的版本。它不是完全動態的:

CREATE TABLE ##t(TENANT VARCHAR(100),  YEAR INT, SALES MONEY) 

INSERT INTO ##t VALUES 
('Tenant 1', 2011, 1000), 
('Tenant 1', 2012, 3000), 
('Tenant 1', 2013, 2000), 
('Tenant 1', 2014, 3000), 
('Tenant 1', 2015, 2000), 
('Tenant 2', 2014, 5000), 
('Tenant 2', 2015, 2000) 


DECLARE @p VARCHAR(100) = '[2011],[2012],[2013],[2014],[2015]' 

DECLARE @s VARCHAR(MAX) = 'select * from ##t 
          pivot(sum(sales) for year in(' + @p + '))p' 

EXEC(@s) 

DROP TABLE ##t 
相關問題