需要获得正确的sql语句

时间:2014-02-24 07:57:44

标签: sql sql-server

我遇到了正确的sql查询问题。首先,我得到了汽车零件工厂,人们创建和注册每个零件。应列出所有至少使用此模型生成该部分的用户。我需要的是给我的表:

列:

用户ID< ---用户ID,根据零件模型而成为部件。

从具有该用户ID的所有记录中选择最短时间< ---选择最短持续时间。 (循环认为每行都有该用户ID并找到)

从具有该用户ID的所有记录制作部分< ---的最长时间选择最长持续时间。 (循环认为每行都有该用户ID并找到)

制作零件的平均时间< ---使用相同的用户ID添加所有记录持续时间并从所有记录数除以。

零件数量< ---该模型由该用户制成的零件数量。


现在我有sql statemet,它给了我所有没有成功的工作人员。

SELECT dd.user_id AS user_id,dar.name AS name,    
dar.surname AS surname,dd.duration AS duration     
FROM tblPart AS d    
INNER JOIN tblUserPart ON dd ON d.part_id = dd.part_id    
INNER JOIN tblUser AS dar ON dd.user_id = dar.user_id    
WHERE d.part_model='SST32KTF'

使用此SQL的数据:http://postimg.org/image/i3w663b1b/

2 个答案:

答案 0 :(得分:2)

您(通常)不必在SQL中自己编写循环。你告诉系统你想要什么,而不是怎么做

SELECT dd.user_id AS user_id,dar.name AS name,    
dar.surname AS surname,minD,maxD,avgD,Cnt
FROM tblPart AS d    
INNER JOIN (
    SELECT
       part_id,user_ud,
       MIN(duration) as minD, MAX(duration) as maxD,
       AVG(duration) as avgD, COUNT(*) as Cnt
    from tblUserPart
    group by part_id,user_id) dd ON d.part_id = dd.part_id    
INNER JOIN tblUser AS dar ON dd.user_id = dar.user_id    
WHERE d.part_model='SST32KTF'

参考文献:MINMAXAVGCOUNT


查看了您的图片后,我现在看到您的模型中的duration被存储为time。这正确使用time数据类型。 time用于存储时间一个时间间隔。目前,在SQL Server中,存储间隔的数据类型并不是很好。最好的方法是将duration存储在int列中,并可能将其重命名为durationMinsdurationSecs。将其保留为time列可能会在将来导致更多问题。

要将其转换为动态,请使用DATEDIFF(minute,'00:00:00',duration)转换为持续时间,使用DATEDIFF(second,'00:00:00',duration),只要我在上述查询中使用了普通duration

答案 1 :(得分:0)

这不是功课吗?这给出了持续时间,以秒为单位如果您需要转换回HH:MM:SS

,请告诉我
SELECT 
dd.user_id AS user_id,ar.name AS name,dar.surname AS surname,
MAX(
(DATEPART(HOUR, dd.duration) * 3600) +
(DATEPART(MINUTE, dd.duration) * 60) +
(DATEPART(SECOND, dd.duration))
) AS maxduration, 
MIN(    (DATEPART(HOUR, dd.duration) * 3600) +
(DATEPART(MINUTE, dd.duration) * 60) +
(DATEPART(SECOND, dd.duration))
) AS minduration, 
AVG(    
(DATEPART(HOUR, dd.duration) * 3600) +
(DATEPART(MINUTE, dd.duration) * 60) +
(DATEPART(SECOND, dd.duration))
) AS avgduration, 
COUNT(*) As PartsCount
FROM tblPart AS d    
INNER JOIN tblUserPart ON dd ON d.part_id = dd.part_id    
INNER JOIN tblUser AS dar ON dd.user_id = dar.user_id    
WHERE d.part_model='SST32KTF'
GROUP BY dd.user_id,ar.name,dar.surname