由于某种原因,我不能理解这件事。我正在尝试从一个多列不同的表中获取ID ...基本上就像这样-
Select ID from table where ID in (Select distinct ID, Card, PunchTime, PunchDate)尽管这显然行不通。我希望获得唯一的I,所有这些字段都是作为标准的。我似乎想不出有效的语法。我不确定我还能说什么,当我看着它的时候,它似乎应该很简单……但是我从昨天开始就开始恢复了,但是什么都不起作用。有人知道我应该走哪条路吗?提前谢谢你!
编辑:发布的东西可以工作,但结果并不是我所期望的。以下是一些saple数据:
ID Card PunchDate PunchTime In/Out
================================
1 00123 3/17/2012 13:00 1
2 00123 3/17/2012 17:00 2
3 00123 3/17/2012 17:00 1
4 00123 3/17/2012 20:00 2
5 00456 3/17/2012 14:00 1
6 00456 3/17/2012 17:00 2我尝试这样做的原因是,计时软件会判断任何与卡片、打卡日期和打卡时间相同的东西都是重复的,无论它是输入打卡还是输出打卡,并删除一个。我唯一的解决方案是消除重复的,基本上使冲压从第一个进入冲压到最后一个冲压,在那里他们是重复的。因此,我的目标是仅选择基于卡片、穿孔日期和穿孔时间的唯一值。然而,我所拥有的并不排除该事件中的ID,这使得它具有唯一的值。我有一个解决方法,所以时间不是一个特别的问题,但我更愿意弄清楚如何才能获得正确的数据。
再次感谢你们的快速回复!
发布于 2012-03-29 22:10:30
使用新信息更新了答案:
SELECT *
FROM TABLE
WHERE NOT EXISTS
(
SELECT 1
FROM TABLE AS Duplicates
WHERE Duplicates.Card = TABLE.Card
AND Duplicates.PunchDate = TABLE.PunchDate
AND Duplicates.PunchTime = TABLE.PunchTime
AND Duplicates.ID != TABLE.ID
)基本上,这就是说,获取所有不具有相同card, punchdate, punchtime的记录(确保不将相同的行计算在内)。
发布于 2012-03-29 23:00:29
假设没有从一天开始到第二天结束的第二班。
表:
DECLARE @table TABLE
(
[ID] INT IDENTITY,
[Card] INT,
[PunchDate] DATETIME,
[PunchTime] DATETIME,
[In/Out] TINYINT
)
INSERT INTO @table
(
[Card],
[PunchDate],
[PunchTime],
[In/Out]
)
SELECT 00123,
'3/17/2012',
'3/17/2012 13:00',
1
UNION ALL
SELECT 00123,
'3/17/2012',
'3/17/2012 17:00',
2
UNION ALL
SELECT 00123,
'3/17/2012',
'3/17/2012 17:00',
1
UNION ALL
SELECT 00123,
'3/17/2012',
'3/17/2012 20:00',
2
UNION ALL
SELECT 00456,
'3/17/2012',
'3/17/2012 14:00',
1
UNION ALL
SELECT 00456,
'3/17/2012',
'3/17/2012 17:00',
2查询:
SELECT [Card],
[PunchDate],
MIN([PunchTime]) [PunchTime],
[In/Out]
FROM @table
WHERE [In/Out] = 1
GROUP BY [Card],
[PunchDate],
[In/Out]
UNION
SELECT [Card],
[PunchDate],
MAX([PunchTime]) [PunchTime],
[In/Out]
FROM @table
WHERE [In/Out] = 2
GROUP BY [Card],
[PunchDate],
[In/Out]
ORDER BY [Card],
[PunchDate]结果:
Card PunchDate PunchTime In/Out
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 1
123 2012-03-17 00:00:00.000 2012-03-17 20:00:00.000 2
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 1
456 2012-03-17 00:00:00.000 2012-03-17 17:00:00.000 2下一步,他会想要这个:
SELECT a.[Card],
a.[PunchDate],
a.[PunchTime],
b.[PunchTime],
DATEDIFF(hour, a.[PunchTime], b.[PunchTime]) TotalTime
FROM (
SELECT [Card],
[PunchDate],
MIN([PunchTime]) [PunchTime]
FROM @table
WHERE [In/Out] = 1
GROUP BY [Card],
[PunchDate]
) a
INNER JOIN (
SELECT [Card],
[PunchDate],
MAX([PunchTime]) [PunchTime]
FROM @table
WHERE [In/Out] = 2
GROUP BY [Card],
[PunchDate]
) b
ON a.[Card] = b.[Card]
AND a.[PunchDate] = b.[PunchDate]
ORDER BY a.[Card],
a.[PunchDate]结果
Card PunchDate PunchTime PunchTime TotalTime
123 2012-03-17 00:00:00.000 2012-03-17 13:00:00.000 2012-03-17 20:00:00.000 7
456 2012-03-17 00:00:00.000 2012-03-17 14:00:00.000 2012-03-17 17:00:00.000 3发布于 2012-03-29 22:35:36
Select
*
FROM
table
WHERE
NOT EXISTS (
SELECT
*
FROM
table AS lookup
WHERE
ID <> table.ID
AND Card = table.Card
AND PunchTime = table.PunchTime
AND PunchDate = table.PunchDate
)https://stackoverflow.com/questions/9927048
复制相似问题