【发布时间】:2015-09-08 07:37:28
【问题描述】:
我知道循环在 SQL 中并不理想,但我想不出另一种方法。
我希望此表 1 中的每个不同行在表 2 中生成每个不同的日期和时间。
换句话说,表 2 的日期介于 2014 年 5 月 1 日到 2015 年 4 月 30 日之间,每个不同的日期有 24 行,一天中的每个小时一个。我现在希望表 1 中的每个不同行在表 2 中都有每个不同的日期,每个日期都是 24 小时。
表 1:
DROP TABLE Baylor_Raw..MEDICAL_SERVICE_DESC
SELECT MEDICAL_SERVICE_DESC
INTO Baylor_Raw..MEDICAL_SERVICE_DESC
FROM Baylor_Raw..Raw_ADT
WHERE MEDICAL_SERVICE_DESC IS NOT NULL AND MEDICAL_SERVICE_DESC NOT IN ('#N/A','CANCEL','DAY SURGERY','HOSPICE','INFUSION')
表 2:
DECLARE @DATE DATE
SET @DATE = '05/01/2014'
DECLARE @HOUR INT
SET @HOUR = 0
DROP TABLE Baylor_Raw..DateTable
CREATE TABLE Baylor_Raw..DateTable
(DATE_OF_DISCHARGE DATE
,HOUR_OF_DISCHARGE INT)
WHILE @DATE<'05/01/2015' BEGIN
WHILE @HOUR<25 BEGIN
INSERT INTO Baylor_Raw..DateTable (DATE_OF_DISCHARGE,HOUR_OF_DISCHARGE)
VALUES (@DATE,@HOUR)
SET @HOUR = @HOUR+1
END
SET @DATE = DATEADD(DD,1,@DATE)
SET @HOUR = 0
END
以下尝试无效。运行时间超过几分钟后我取消了。
DECLARE @MEDICAL_SERVICE_DESC NVARCHAR(255)
SET @MEDICAL_SERVICE_DESC = (SELECT MIN(MEDICAL_SERVICE_DESC) FROM Baylor_Raw..MEDICAL_SERVICE_DESC)
DECLARE @DATE DATE
SET @DATE = '05/01/2014'
DECLARE @HOUR INT
SET @HOUR = 0
DROP TABLE Baylor_Raw..DateTable
CREATE TABLE Baylor_Raw..DateTable
(MEDICAL_SERVICE_DESC NVARCHAR,
DATE_OF_DISCHARGE DATE
,HOUR_OF_DISCHARGE INT)
WHILE @MEDICAL_SERVICE_DESC IS NOT NULL BEGIN
WHILE @DATE<'05/01/2015' BEGIN
WHILE @HOUR<25 BEGIN
INSERT INTO Baylor_Raw..DateTable (MEDICAL_SERVICE_DESC,DATE_OF_DISCHARGE,HOUR_OF_DISCHARGE)
VALUES (@MEDICAL_SERVICE_DESC,@DATE,@HOUR)
SET @HOUR = @HOUR+1
END
SET @DATE = DATEADD(DD,1,@DATE)
SET @HOUR = 0
END
DELETE FROM Baylor_Raw..MEDICAL_SERVICE_DESC WHERE MEDICAL_SERVICE_DESC = @MEDICAL_SERVICE_DESC
SET @MEDICAL_SERVICE_DESC = (SELECT MIN(MEDICAL_SERVICE_DESC) FROM Baylor_Raw..MEDICAL_SERVICE_DESC)
SET @DATE = '05/01/2014'
END
【问题讨论】:
-
我现在就告诉你,我认为你没有正确处理这个问题。试着用文字解释你想要达到的目标,比如这些表格到底是做什么用的?然后用样本数据提供一些基本的输入和输出。我敢打赌有一种更简单的方法可以做到这一点而无需循环。
-
我同意。但是,我只需要创建一次这个表,这就是为什么我认为使用循环就足够了。
-
哦,这还不错。好吧,我很高兴 thorsten 回答了你的问题!
标签: sql sql-server tsql while-loop