SQL查询-我被难住了。。。不包括记录
请参阅随附的mage,这是一名员工7天的记录。我想做的是排除所有员工记录7,如果每列ST、OT、DT、PayPerdiem、PayTruck、PayTravel的所有7个记录的总和等于零 基本上,如果任何总数大于0,并且所有雇员总数的记录都不等于0,那么我需要雇员的所有7条记录 因此,员工ATE不应返回任何记录,但员工BEADLING应返回7条记录 这有意义吗?有人能帮忙吗?这是为了提供一个数据透视表,经过几天的尝试,我简直搞不懂。请帮忙SQL查询-我被难住了。。。不包括记录,sql,Sql,请参阅随附的mage,这是一名员工7天的记录。我想做的是排除所有员工记录7,如果每列ST、OT、DT、PayPerdiem、PayTruck、PayTravel的所有7个记录的总和等于零 基本上,如果任何总数大于0,并且所有雇员总数的记录都不等于0,那么我需要雇员的所有7条记录 因此,员工ATE不应返回任何记录,但员工BEADLING应返回7条记录 这有意义吗?有人能帮忙吗?这是为了提供一个数据透视表,经过几天的尝试,我简直搞不懂。请帮忙 如果某个员工至少有一行的值大于0,则可以使用如下方式返回
如果某个员工至少有一行的值大于0,则可以使用如下方式返回该员工的所有记录: rextester演示: 对于此示例数据:
create table t (Employee int, calendardate date, st int, ot int, dt int, payperdiem int, paytruck int, paytravel int)
insert into t values
(1,'20170401',0,0,0,0,0,0)
,(1,'20170402',0,0,0,0,0,0)
,(1,'20170403',0,0,0,0,0,0)
,(1,'20170404',2,0,0,0,0,0) /* this one has a value */
,(2,'20170401',0,0,0,0,0,0)
,(2,'20170402',0,0,0,0,0,0)
,(2,'20170403',0,0,0,0,0,0)
,(2,'20170404',0,0,0,0,0,0)
返回:
+----------+--------------+----+----+----+------------+----------+-----------+
| Employee | calendardate | st | ot | dt | payperdiem | paytruck | paytravel |
+----------+--------------+----+----+----+------------+----------+-----------+
| 1 | 2017-04-01 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2017-04-02 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2017-04-03 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 2017-04-04 | 2 | 0 | 0 | 0 | 0 | 0 |
+----------+--------------+----+----+----+------------+----------+-----------+
如果可以使用负值,则可能需要比较总和
请尝试以下方法
SELECT CalendarDate,
tblTable.Employee,
PayCodeName,
ST,
OT,
DT,
PayPerdiem,
PayTruck,
PayTravel
FROM tblTable
JOIN ( SELECT Employee
FROM tblTable
GROUP BY Employee
HAVING SUM( ST +
OT +
DT +
PayPerdiem +
PayTruck +
PayTravel ) > 0
) EmployeeFinder ON tblTable.Employee = EmployeeFinder.Employee
ORDER BY tblTable.Employee,
CalenadrDate;
此语句首先按员工对tblTable中的每条记录进行分组,然后将该列表细化为所有总计字段总计大于0的组
然后使用tblTable对结果数据集执行内部联接,这将消除子查询结果中未出现的员工记录
然后选择tblTable的剩余记录的字段并对记录进行排序
如果您有任何问题或意见,请随时发表相应的意见。没有附加图像?不过,将代码发布到您的问题中会更好。添加。抱歉-第一篇博文为了提高问题的质量,请将字段名和示例数据复制为问题中的文本表。请另外制作一个文本表,显示您希望结果如何显示。还请向我们展示您尝试过的代码(如果有)以及它产生的任何错误消息的全文。您的RDBMS是什么?MySQL Postgres?这是一个非常简单的站点,用于将数据转换为文本表,您可以从SSMS或excel等进行复制和粘贴:我认为这将只打印有非零值的行,而不是所有7行(如果其中一行在三列中的一列中有非零值)。真的吗?@Jackson不是真的。@Jackson我添加了一个简单的演示来说明。很好!谢谢,我在我们自己的数据库上尝试了类似的查询。这太棒了@斯坦尼奇试试这个,似乎是最有效的。我会记下来的,胡安。效果很好。
SELECT t1.*
FROM t as t1
JOIN (SELECT Employee
FROM t
GROUP BY Employee
HAVING SUM(st) > 0
OR SUM(ot) > 0
OR SUM(dt) > 0
OR SUM(payperdiem) > 0
OR SUM(paytruck) > 0
OR SUM(paytravel) > 0
) as t2
ON t1.Employee = t2.Employee
SELECT CalendarDate,
tblTable.Employee,
PayCodeName,
ST,
OT,
DT,
PayPerdiem,
PayTruck,
PayTravel
FROM tblTable
JOIN ( SELECT Employee
FROM tblTable
GROUP BY Employee
HAVING SUM( ST +
OT +
DT +
PayPerdiem +
PayTruck +
PayTravel ) > 0
) EmployeeFinder ON tblTable.Employee = EmployeeFinder.Employee
ORDER BY tblTable.Employee,
CalenadrDate;