【问题标题】:SQL, Select in Looping returning repeated valuesSQL,在循环中选择返回重复值
【发布时间】:2018-03-14 03:32:46
【问题描述】:

我从事一个项目已经很长时间了,但我似乎不知道如何去做。我有一个循环代码和一个函数组合,但似乎无法获得我想看到的输出。

我的代码是这样的:

WITH CTE AS
(
    SELECT 1 as Day
    UNION ALL
    SELECT Day+1 FROM CTE
    WHERE Day < 15
), Name as (Select * from fn_logs(@Month, @Year,@date_from,@date_to)

)

SELECT CTE.Day, 
CASE WHEN Name.DAtee != CTE.Day THEN Name.Fullname ELSE Name.Fullname END as Fullname,  
CASE WHEN Name.DAtee != CTE.Day THEN ' ' ELSE Name.AMIN END as AMIN, 
CASE WHEN Name.DAtee != CTE.Day THEN ' ' ELSE Name.AMOUT END as AMOUT, 
CASE WHEN Name.DAtee != CTE.Day THEN ' ' ELSE Name.PMIN END as PMIN, 
CASE WHEN Name.DAtee != CTE.Day THEN ' ' ELSE Name.PMOUT END as PMOUT
FROM CTE, Name

group by CTE.Day,Name.Fullname,Name.AMIN,Name.AMOUT,Name.PMIN,Name.PMOUT

Name.DAtee 获取日期的日期 我想要的输出是这样的:

Day  Fullname  AM-IN  AM-OUT  PM-IN  PM-OUT
1    Ara Ast   8:00   12:00   12:03  5:00
2    Ara Ast   7:51   12:22   12:23  5:10
3    Ara Ast      
1    Clara Est 8:01   12:12   12:25  5:07
2    Clara Est 
3    Clara Est 7:41   12:02   12:15  5:00

我想显示单个员工记录的所有日期,如果没有记录日期,它将自动显示没有值。我得到的输出是这样的:

Day  Fullname  AM-IN  AM-OUT  PM-IN  PM-OUT
1    Ara Ast   8:00   12:00   12:03  5:00
2    Ara Ast   
3    Ara Ast 
1    Ara Ast   
2    Ara Ast   7:51   12:22   12:23  5:10
3    Ara Ast 
1    Ara Ast   
2    Ara Ast   
3    Ara Ast      

样本数据

INSERT INTO table1 (Fullname, Date, AMIN, AMOUT, PMIN, PMOUT) VALUES 
('Ara Ast', '2/1/2018','8:00 AM','12:00 PM','1:00 PM','5:00 PM'), 
('Ema Watson', '2/1/2018','8:00 AM','12:00 PM','1:00 PM','5:00 PM'), 
('Ema Watson', '2/2/2018','8:00 AM','12:00 PM','1:00 PM','5:00 PM'), 
('Ara Ast', '2/3/2018','8:00 AM','12:00 PM','1:00 PM','5:00 PM');

这些值似乎是重复的,只要值不等于日期,它就会打印 no 值。对不起,我还处于 sql server 编码的学习阶段。

提前致谢。

【问题讨论】:

  • 你的数据库版本是多少? db2,mssql,mysql?
  • @D-Shih 我目前正在使用 SSMS 2016
  • 请提供一些示例数据和他们的预期输出
  • @uzi INSERT INTO table1(全名、日期、AMIN、AMOUT、PMIN、PMOUT)值('Ara Ast'、'2/1/2018'、'8:00 AM'、'12 :00 PM','1:00 PM','5:00 PM'), ('Ema Watson', '2/1/2018','8:00 AM','12:00 PM','1 :00 PM','5:00 PM'), ('Ema Watson', '2/2/2018','8:00 AM','12:00 PM','1:00 PM','5 :00 PM'), ('Ara Ast', '2/3/2018','8:00 AM','12:00 PM','1:00 PM','5:00 PM'); --对于一些示例数据。我想要发生的输出包括在上面。与上述相同的模式。
  • 在您的示例数据中,日期为 date,而问题中的日期为 int。您如何确定第一天?

标签: sql sql-server stored-procedures sql-server-2016


【解决方案1】:

检查此查询。根据您的评论,这就是您所需要的

declare @t table (Fullname varchar(100), Date date, AMIN varchar(100), AMOUT varchar(100), PMIN varchar(100), PMOUT varchar(100))

INSERT INTO @t (Fullname, Date, AMIN, AMOUT, PMIN, PMOUT) 
VALUES ('Ara Ast', '20180201','8:00 AM','12:00 PM','1:00 PM','5:00 PM')
    , ('Ema Watson', '20180201','8:00 AM','12:00 PM','1:00 PM','5:00 PM')
    , ('Ema Watson', '20180202','8:00 AM','12:00 PM','1:00 PM','5:00 PM')
    , ('Ara Ast', '20180203','8:00 AM','12:00 PM','1:00 PM','5:00 PM');

;WITH CTE AS
(
    SELECT 1 as Day
    UNION ALL
    SELECT Day+1 FROM CTE
    WHERE Day < 15
)
select 
    * 
from 
    cte c
    cross join (select distinct Fullname from @t) t
    left join @t tt on t.Fullname = tt.Fullname and c.Day = day(tt.Date)
order by 2,1

【讨论】:

  • 哇!它工作得很好,但是连接是如何做到的呢?抱歉,我对其程序感到困惑。
  • @JohnClarenceCastro,主要部分是cross join。它形成了每个人与所有日子的所有组合
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 2015-02-13
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多