我已经通过这里检查了如何使用group by来计算行数,但我认为我实现的是错误的,或者遗漏了一些东西。
我有什么: 两列数据。 Machine_GroupID(我从中提取客户端名称)。第二列fieldValue包含Machine的发货日期(我仅从中提取年份)。
SQL 2012服务器
示例:
+------------------------------+-----------------------+
| Machine_GroupID(Client Name) | fieldValue(Ship Date) |
+------------------------------+-----------------------+
| Site1.clientA | 2015-05-07 |
| Site2.clientA | 2014-01-06 |
| Department.Site1.clientA | 2015-02-05 |
| Site1.clientB | 2014-03-04 |
| Department.Site1.ClientC | 2015-10-01 |
+------------------------------+-----------------------+
我要做的是:
我正在尝试生成一份报告,以显示客户在某一年购买的所有工作站。这最终将成为reportviewer中的报告,或者是向我们的执行团队显示数据的有用信息。
所需报告示例:
Machines purchased in 2015
+---------+------------------------+
| ClientA | 2(Count of fieldValue) |
+---------+------------------------+
| ClientC | 1 |
+---------+------------------------+
Machines purchased in 2014
+---------+---+
| ClientA | 1 |
+---------+---+
| ClientB | 1 |
+---------+---+
我的代码到目前为止:
select count(*), reverse(left(reverse(Machine_GroupID) ,
charindex('.',reverse(Machine_GroupID))-1)) as Client ,
LEFT(fieldValue,4) AS "Ship Year"
from dbo.vSystemInfoManual
where fieldName = 'Ship Date'
group by fieldValue, Machine_GroupID
此代码生成一个如下所示的表:
+---+----------+-----------+
| | Client | Ship Year |
+---+----------+-----------+
| 1 | ClientA | 2015 |
| 1 | ClientA | 2015 |
| 1 | ClientA | 2014 |
| 1 | ClientB | 2014 |
| 1 | ClientC | 2015 |
+---+----------+-----------+
我可以对代码进行更改以使其成为可能吗?我试图用这个查询做太多吗?我还在学习SQL所以任何帮助都绝对值得赞赏!谢谢。
答案 0 :(得分:2)
您的样本数据与您发布的结果并不相符。无论如何,我会使用PARSENAME函数更改获取Client
值的方式:
SELECT PARSENAME(Machine_GroupID,1) Client,
LEFT(fieldValue,4) [Ship Year],
COUNT(*) N
FROM dbo.vSystemInfoManual
WHERE fieldName = 'Ship Date'
GROUP BY PARSENAME(Machine_GroupID,1),
LEFT(fieldValue,4);