SQL:显示每个月的所有产品,即使

时间:2018-03-28 11:08:08

标签: sql sql-server

我试图创建一个查询,向我显示每个月的所有产品,但是我遇到了问题,因为如果某个产品在某个月内没有销售,它就不会出现了,我希望传递价值逐月进步。

例如,如图所示:enter image description here

你可以看到2月份我有OLD和ORD,但因为在3月和4月没有销售的产品我看不到,5月也没有,因为没有销售的OLD产品不会出现。我希望每个月都能拥有所有产品,即使在开始时它也是空的。

类似的东西:

  

2015年2月:

     

0-OIR,2-OLD,2-ORD

     

2015年3月:0-OIR,2-OLD,2-ORD

     

2015年4月:0-OIR,2-OLD,2-ORD

     

2015年5月:1-OIR,2-OLD,5-ORD

     

2015年6月:1-OIR,2-OLD,7-ORD

等表格直到当前日期

左边的列,每个产品的累计总和,以及年和月之间的所有产品的累积总和。

查询看起来像这样。

    select  
    sum(a.count) over (partition by [Product Name] ORDER BY Year,Month) as 'Sum Per Product'
    ,a.[Product Name]
    ,a.month
    ,a.Year
    ,sum(a.Count) OVER (ORDER BY Year,Month) as 'Cumulative Sum of all products'

    ,
    case
    a.Month
    when 1 then 'January'
    when 2 then 'February'
    when 3 then 'March'
    when 4 then 'April'
    when 5 then 'May' 
    when 6 then 'June' 
    when 7 then 'July' 
    when 8 then 'August' 
    when 9 then 'September' 
    when 10 then 'October' 
    when 11 then 'November' 
    when 12 then 'December' 
    end [months]
from (
SELECT 

    count(COALESCE(p.ShortName + ' ' ,'No Product')) as 'Count'
    ,COALESCE(p.ShortName + ' ' ,'No Product') as 'Product Name'
    ,MONTH(m.CreatedDatetime) AS 'Month'
   ,YEAR(m.CreatedDatetime) AS 'Year'



FROM Request r

LEFT JOIN Contact c on r.ContactId = c.ID
LEFT JOIN Machine m on r.machineId = m.ID
LEFT JOIN MachineStatus ms on m.active = ms.ID
 join machineProduct mp on m.Id=mp.MachineId
LEFT JOIN RequestProduct rp on r.ID = rp.RequestId
LEFT JOIN ProductVersion pv on pv.ID = rp.ProductVersionId
LEFT JOIN Product p on pv.ProductId = p.ID




WHERE 
 m.statusid in (1,2)
GROUP BY  COALESCE(p.ShortName + ' ' ,'No Product'), YEAR(m.CreatedDatetime),MONTH(m.CreatedDatetime)) a

group by Month,Year,a.count,a.[Product Name]
Order by a.Year,a.Month,a.[Product Name],[months]

编辑:

我已经创建了一个看起来像这样的临时表,但是如何将它连接到我的主查询以从Temp Table + 2列中检索每个产品的累积求和和所有产品的累积求和。

查询看起来像这样

`Declare @temp table 
(id int
,name nvarchar(40)
,yeari int
,monthi int
)

-


Insert into @temp (id,name,yeari,monthi) (Select prd.id,prd.shortname,mac.yeari,mac.monthi 
            from (Select  id,shortname from Product where Product.Active=1) prd
            cross join (select distinct year(m.createddatetime) as yeari
                        ,month(m.createddatetime) as monthi
FROM machine m 
) mac)`

输出如下所示:

enter image description here

如何连接它们?

0 个答案:

没有答案