如何使用SQL计算两个单独的行,然后显示单独的计数

时间:2015-05-13 13:32:34

标签: sql-server

我已经通过这里检查了如何使用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所以任何帮助都绝对值得赞赏!谢谢。

1 个答案:

答案 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);