2016-10-22 53 views
0

我正在开发一个小项目来提供从数据库中提取数据的应用程序,以显示一周中每天的发货量。我已经取得了一些进展,现在有脚本统计所有的发货,但是因为我基于varchar类型的列对它们进行了计数,我还需要解决方案来分别计算每周的每一天的平均值。来自数据透视表的平均计数数据 - 需要帮助

到目前为止,我最终的东西如下:

SELECT [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday] 
    FROM (
     SELECT DATENAME(dw, Shipment.Date) AS DayWeek, Shipment.ID 
     FROM Shipment 
     WHERE MONTH(Shipment.Date)= MONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0, 'OCTOBER 2016'), 0)) AND 
     Shipment.Bur = 'GB' 
) AS src 
pivot (
    COUNT(ID) FOR DayWeek IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday]) 
) AS pvt 

我欣赏很多的任何提示或帮助,因为它看起来像我跑出来的,此刻的想法,并能得到任何进一步的提供正确的解决方案。

+0

您可以发布样本数据和预期结果吗? –

回答

0

我发现我的问题的答案通过计算器浏览遇到上发布用户的一个类似的问题。

SELECT [Day], SUM(q.Totals) AS "Weekly Shipment Amount", AVG(Totals) AS [Avg] 
FROM 
(
    SELECT 
    w = DATEDIFF(WEEK, 0, DATE), 
     [Day] = DATENAME(Weekday, DATE), 
     Totals = COUNT(*) 
    FROM dbo.Shipment 
    --INNER JOIN FCLI (NOLOCK) ON FCLI.CCLI = FEXP.CCLI 
     WHERE (BUR = 'GB' AND 
     Shipment.Date >= '20160601' AND Shipment.Date <= '20160630') 

    GROUP BY 
     DATEDIFF(WEEK, 0, Date), 
     DATENAME(WEEKDAY, Date), 
     DATEPART(WEEKDAY, Date) 
) AS q 
GROUP BY [Day] 
ORDER BY [DaY] ASC; 
0

我建议干脆用pivot分销和不同的行把对结果:

SELECT DayWeek, AVG(cnt) 
FROM (SELECT s.Date, DATENAME(dw, s.Date) AS DayWeek, COUNT(*) as cnt 
     FROM Shipment s 
     WHERE MONTH(s.Date) = MONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0, 'OCTOBER 2016'), 0)) AND 
      s.Bur = 'GB' 
     GROUP BY s.Date 
    ) d 
GROUP BY DayWeek 
ORDER BY MIN(s.Date);