SQL - 如何计算每天一行中每个状态的记录?

Fra*_*nva 4 sql t-sql sql-server sql-server-2008 sql-server-2012

更新2

对不起,我忘了提,我只需要日期部分,而FormUpdated不是所有部分.


我有一张桌子 Sales

Sales
--------
id
FormUpdated
TrackingStatus
Run Code Online (Sandbox Code Playgroud)

有几种状态,例如Complete,Incomplete,SaveforLater,ViewRates等.

我希望在过去8天(包括今天)中以此表格获得我的结果.

预期结果:

Date Part of FormUpdated, Day of Week, Counts of ViewRates, Counts of Sales(complete), Counts of SaveForLater
--------------------------------------
2015-05-19   Tuesday    3   1   21  
2015-05-18   Monday     12  5   10
2015-05-17   Sunday     6   1   8
2015-05-16   Saturday   5   3   7 
2015-05-15   Friday     67  5   32
2015-05-14   Thursday   17  0   5 
2015-05-13   Wednesday  22  0   9
2015-05-12   Tuesday    19  2   6
Run Code Online (Sandbox Code Playgroud)

这是我的SQL查询:

select  datename(dw, FormUpdated), count(ID), TrackingStatus 
from Sales
where FormUpdated <= GETDATE()
AND FormUpdated >= GetDate() - 8
group by  datename(dw, FormUpdated), TrackingStatus
order by  datename(dw, FormUpdated) desc
Run Code Online (Sandbox Code Playgroud)

我不知道如何进行下一步.

请帮忙,谢谢!

ugh*_*hai 7

您可以使用SUM(CASE WHEN TrackingStatus = 'SomeTrackingStatus' THEN 1 ELSE 0 END))获取单个列中每个跟踪状态的状态计数.像这样的东西.SQL小提琴

select  
CONVERT(DATE,FormUpdated) FormUpdated,
DATENAME(dw, CONVERT(DATE,FormUpdated)),
SUM(CASE WHEN TrackingStatus = 'ViewRates' THEN 1 ELSE 0 END) c_ViewRates,
SUM(CASE WHEN TrackingStatus = 'Complete' THEN 1 ELSE 0 END) c_Complete,
SUM(CASE WHEN TrackingStatus = 'SaveforLater' THEN 1 ELSE 0 END) c_SaveforLater 
from Sales
where FormUpdated <= GETDATE()
AND FormUpdated >= DATEADD(D,-8,GetDate())
group by  CONVERT(DATE,FormUpdated)
order by  CONVERT(DATE,FormUpdated) desc
Run Code Online (Sandbox Code Playgroud)


Stu*_*tLC 5

您还可以使用PIVOT实现这一结果-你只需要完成的列表TrackingStatus中两个名字SELECTFOR,并没有GROUP BY要求:

WITH DatesOnly AS
(
  SELECT Id, CAST(FormUpdated AS DATE) AS DateOnly, DATENAME(dw, FormUpdated) AS DayOfWeek, TrackingStatus
  FROM Sales
)
SELECT  DateOnly, DayOfWeek, 
        -- List of Pivoted Columns
        [Complete],[Incomplete], [ViewRates], [SaveforLater]
FROM DatesOnly
PIVOT 
(
   COUNT(Id)
   -- List of Pivoted columns
   FOR TrackingStatus IN([Complete],[Incomplete], [ViewRates], [SaveforLater])
) pvt
WHERE  DateOnly <= GETDATE() AND DateOnly >= GetDate() - 8
ORDER BY DateOnly DESC
Run Code Online (Sandbox Code Playgroud)

SqlFiddle

此外,我认为您的ORDER BY是错误的 - 它应该是日期,而不是星期几.