【问题标题】:12 months sale and max of them in sql server 2008在 sql server 2008 中销售 12 个月,最多销售
【发布时间】:2016-09-01 06:25:31
【问题描述】:

我有一个查询要找出来自salesdata table 的Material wiseandMonth wise 数据

样本

我可以找到以下数据

MaterialNo  Jan   Feb   Mar   Apr   May   Jun   Jul  Aug  Sep  Oct  Nov  Dec  
1           10    15    20    30    40    45    56   85   100  95   42   32   
2           12    20    86    32    45    42    62   74   86   42   84   62
3           15    20    46    54    46    42    19   0    62   75   94   98

我想要 SQL SERVER 2008 R2 中的最后两列(MaxSale、MaxSaleMonth)

MaterialNo  Jan   Feb   Mar   Apr   May   Jun   Jul  Aug  Sep  Oct  Nov  Dec  MaxSale   MaxSaleMonth
1           10    15    20    30    40    45    56   85   100  95   42   32   100       Sep
2           12    20    86    32    45    42    62   74   86   42   84   62   86        Mar
3           15    20    46    54    46    42    19   0    62   75   94   98   98        Dec

请给我建议最简单的解决方案。

我的当前查询如下

Select 
MaterialNo,
SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Jan-2015' AND  '31-Jan-2015' THEN SalesData.iQty  ELSE 0 END) AS [Jan],
SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Feb-2015' AND  '28-Feb-2015' THEN SalesData.iQty  ELSE 0 END) AS [Feb],
SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Mar-2015' AND  '31-Mar-2015' THEN SalesData.iQty  ELSE 0 END) AS [Mar],
SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Apr-2015' AND  '30-Apr-2015' THEN SalesData.iQty  ELSE 0 END) AS [Apr]
From SalesData
Group By
MaterialNo

【问题讨论】:

  • 请发布您的查询。建议:创建子查询来获取你需要的数据。
  • 我发布我现有的查询
  • @Hirengardhariya 我已经更新了我的答案。首先,您必须创建一个函数,然后在您的选择查询中使用。

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


【解决方案1】:

使用 Pivot .. 您可以找到最简单的方法。

select max(month), row_max = max(val)
from yourtable
pivot
(
  salesmonth 
  for col in (C1, C2, C3, C4..c12)
) piv
group by id

【讨论】:

    【解决方案2】:
    ; with
    cte as
    (
        select  MaterialNo, 
                SalesMth    = month(dSalesDate),
                iQty        = sum(iQty)
        from    SalesData
        where   dSalesDate  >= '2015-01-01'
        and     dSalesDate  <  '2016-01-01'
        group by MaterialNo, month(dSalesDate)
    )
    select  MaterialNo, [1] as Jan, [2] as Feb, [3] as Mar, . . . . .
            iQty as MaxSales, SalesMth as MaxMth
    from    cte c
        pivot
        (
            sum(iQty)
            for SalesMth in ([1], [2], [3], [4], [5], . . .. )
        ) p
        outer apply
        (
            select  top 1 SalesMth, iQty 
            from    cte x
            where   x.MaterialNo    = MaterialNo
            order by iQty desc
        ) m
    

    【讨论】:

      【解决方案3】:

      您可以使用以下查询来获取结果。首先创建一个在选择查询中使用的函数。

      CREATE FUNCTION [dbo].GREATEST(@val1 int, @val2 int,@val3 int, @val4 int,@val5 int, @val6 int,@val7 int, @val8 int,@val9 int, @val10 int,@val11 int, @val12 int) returns int as begin
      declare @intMax as int
      set @intMax = @val1
      if @val2 > @intMax
          set @intMax = @val2
      if @val3 > @intMax
          set @intMax = @val3
      if @val4 > @intMax
          set @intMax = @val4
      if @val5 > @intMax
          set @intMax = @val5
      if @val6 > @intMax
          set @intMax = @val6
      if @val7 > @intMax
          set @intMax = @val7
      if @val8 > @intMax
          set @intMax = @val8
      if @val9 > @intMax
          set @intMax = @val9
      if @val10 > @intMax
          set @intMax = @val10
      if @val11 > @intMax
          set @intMax = @val11
      if @val12 > @intMax
          set @intMax = @val12
      return @intMax
      end
      
      SELECT MaterialNo, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec , GREATEST(score1, score3, score3, score4) AS MaxSale   
      CASE GREATEST(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) 
           WHEN Jan THEN 'Jan'
           WHEN Feb THEN 'Feb'
           WHEN Mar THEN 'Mar'
           WHEN Apr THEN 'Apr'
           WHEN May THEN 'May'
           WHEN Jun THEN 'Jun'
           WHEN Jul THEN 'Jul'
           WHEN Aug THEN 'Aug'
           WHEN Sep THEN 'Sep'
           WHEN Oct THEN 'Oct'
           WHEN Nov THEN 'Nov'
           WHEN Dec THEN 'Dec'
         END AS MaxSaleMonth
      FROM salesdata 
      

      【讨论】:

      • 您确定GREATEST() 在SQL Server 中可用吗?
      • No GREATEST 在 SQL Server 中不可用,但您可以创建一个名为 GREATEST 的函数,然后使用您可以在函数中编写登录名。这是获得结果的最简单方法
      【解决方案4】:

      这会有所帮助..

      SELECT monthdata.MaterialNo,[Jan],[Feb],[Mar],[Apr],MaxSale,MaxSaleMonth
      FROM (
      Select 
      MaterialNo,
      SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Jan-2015' AND  '31-Jan-2015' THEN SalesData.iQty  ELSE 0 END) AS [Jan],
      SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Feb-2015' AND  '28-Feb-2015' THEN SalesData.iQty  ELSE 0 END) AS [Feb],
      SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Mar-2015' AND  '31-Mar-2015' THEN SalesData.iQty  ELSE 0 END) AS [Mar],
      SUM(CASE WHEN CAST(SalesData.dSalesDate AS DATE) BETWEEN '01-Apr-2015' AND  '30-Apr-2015' THEN SalesData.iQty  ELSE 0 END) AS [Apr]
      From SalesData
      Group By MaterialNo
      )monthdata
      INNER JOIN 
      (
      SELECT MaterialNo ,unitsSold AS MaxSale   
      ,mnt AS MaxSaleMonth
      FROM (
      SELECT  MaterialNo,ROW_NUMBER() OVER ( PARTITION BY MaterialNo
      ORDER BY SUM(iQty) DESC
      )rowid,SUM(iQty) unitsSold
      ,DATENAME(MONTH,CAST(CAST (Month(dSalesDate) AS VARCHAR )+'/01/'+CAST(YEAR(dSalesDate)  AS VARCHAR )AS DATETIME)) AS mnt
      FROM SalesData
      WHERE  dSalesDate BETWEEN '01-Jan-2015'
      AND '30-Apr-2015'
      GROUP BY MaterialNo,Month(dSalesDate),YEAR(dSalesDate)
      ) a
      WHERE rowid=1
      )maxdata ON maxdata.MaterialNo=monthdata.MaterialNo
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多