SQL查询以每年为基础动态显示销售额

时间:2015-11-16 07:39:30

标签: sql sql-server sql-server-2008

我将创建一个SQL查询,该查询将根据其开始时间直到当前时间显示租户的销售额,除非它已经不活动。在下面给出的表格中,租户1和2显示了他们每年的销售额。租户1在2011年开始时有5行,2014年有租户2。

<select class="selectpicker" name="choixVarX" id="choixVarX" size="1" onChange="populateMap('#DDDDC2','#000000',listeComparaison);">
        <option value="Pop">Population</option>
        <option value="FoyersImposes">Nombre de foyers imposés</option>
        <option value="FoyersFiscaux">Nombre de foyers fiscaux</option>
        <option value="PropRetraite">Part des retraites dans les revenus</option>
        <option value="PropFoyersImposes">Proportion de foyers imposés</option>
        <option value="RevMoyen">Revenu moyen</option>
      </optgroup>
    </select>
    <select class="selectpicker" multiple name="parametresX[]" id="parametresX" size="1" data-width="150px" onChange="populateMap('#DDDDC2','#000000',listeComparaison);" data-max-options="3">
      <optgroup label="Centrage des données" data-max-options="1" id="centrageX">
        <option value="median">Médiane des communes</option>
        <option value="moyenne">Moyenne des communes</option>
        <option value="pasCentre">Ne pas centrer</option>
      </optgroup>
      <optgroup label="Dispersion" id="dispersionX" data-max-options="1">
        <option value="minmax">Min-Max</option>
        <option value="ecarttype">Ecart-type</option>
        <option value="noDispersion">Aucun</option>
      </optgroup>
      <optgroup label="Echelle" id="echelleX" data-max-options="1">
        <option value="echelleComplete">Echelle étendue</option>
        <option value="echelleAdaptee">Echelle réduite</option>
      </optgroup>
    </select>

$('#choixVarX').on('change',function(){
  if($('#choixVarX').val()=="FoyersImposes" || $('#choixVarX').val()=="FoyersFiscaux" || $('#choixVarX').val()=="Pop"){
    $('.selectpicker').selectpicker('refresh');
    $('#centrageX option[value="median"]').attr('selected',false);
    $('#centrageX option[value="moyenne"]').attr('selected',false);    
    $('#centrageX option[value="pasCentre"]').attr('selected',true);
    $('#dispersionX option[value="minmax"]').attr('selected',false);
    $('#dispersionX option[value="ecarttype"]').attr('selected',false);
    $('#dispersionX option[value="noDispersion"]').attr('selected',true);
    $('#centrageX').attr('disabled',true);
    $('#dispersionX').attr('disabled',true);
    $('.selectpicker').selectpicker('refresh');
  }else{
    $('#centrageX').attr('disabled',false);
    $('#dispersionX').attr('disabled',false);
    $('.selectpicker').selectpicker('refresh');
  }
});

到目前为止,我完全失去了该做什么,我有一个现有的代码,不知怎的做同样但它是静态的,并且在它显示的年份不灵活,默认是5年,它是在垂直形式。

+----------+------+-------------+
|  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     |
+----------+------+-------------+

租户销售表

  • 租户
  • 位置
  • 日期
  • 销售

3 个答案:

答案 0 :(得分:2)

您可以尝试在GROUP BY和年份上执行TENANT以获得所需的输出:

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

答案 1 :(得分: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 |

答案 2 :(得分:0)

您可以传递一个为pivot语句准备好的参数,而不是传递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
相关问题