現有表:a_ysdate 資料如下:
Number DATE TIME
1001 2019-09-01 00:00:00.000 08:00
1001 2019-09-01 00:00:00.000 12:00
1001 2019-09-01 00:00:00.000 13:30
1001 2019-09-01 00:00:00.000 17:30
1001 2019-09-02 00:00:00.000 08:00
1001 2019-09-02 00:00:00.000 12:00
1001 2019-09-02 00:00:00.000 13:30
1001 2019-09-02 00:00:00.000 17:30
1002 2019-09-02 00:00:00.000 13:30
1002 2019-09-02 00:00:00.000 17:30
……
現需要查詢得到結果如下;
1001 2019-09-01 00:00:00.000 08:00,12:00,13:30,17:30
1001 2019-09-02 00:00:00.000 08:00,12:00,13:30,17:30
1002 2019-09-02 00:00:00.000 13:30,17:30
*****注意SQL版本為2000 ,無法使用FOR XML PATH 進行查詢(專案條件不允許無法使用更高版本資料庫),所以不要推薦FOR XML PATH
現再使用方法是:
建立函式:
CREATE FUNCTION [dbo].[GRQDSumNEW](@MYNumber varchar(16),@MYDate datetime)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @values varchar(8000)
SET @values = ''
SELECT @values = @values + ',' +substring(Time,0,6) FROM a_ysdate
WHERE number=@MYNumber and Date=@MYDate order by Time
RETURN STUFF(@values, 1, 1, '')
END
---
在呼叫函式插入臨時表查詢
SELECT Number,Date,(dbo.GRQDSumNEW(Number,Date)) AS NewTime FROM a_ysdate
WHERE Date>='2019-09-01' and DATE<='2019-09-30' GROUP BY Number,DATE
但是這種方法效率太低,a_ysdate 表資料會比較龐大,一個月下來可能會有50-100W的資料量。查詢一個月的資料耗時很久。
請問有啥好的方法可以實作;
*****注意SQL版本為2000 ,無法使用FOR XML PATH 進行查詢;
uj5u.com熱心網友回復:
用變數加臨時表,update,要是with不能用就用臨時表
uj5u.com熱心網友回復:
--你這個應該是考勤資料,那么打卡時間應該有個規則
--你可以按時間段去判斷一下,有效的再拼接
--這個雖然不是完美,但是只查詢一次你的a_ysdate 資料表,速度上應該有提高
--以下代碼substring和replace是為了去掉多余的逗號
CREATE TABLE #T
(
Number varchar(10) ,
[DATE] DATE,
[TIME] TIME
)
INSERT INTO #T VALUES('1001', '2019-09-01 00:00:00.000','08:00')
INSERT INTO #T VALUES('1001', '2019-09-01 00:00:00.000','12:00')
INSERT INTO #T VALUES('1001', '2019-09-01 00:00:00.000','13:30')
INSERT INTO #T VALUES('1001', '2019-09-01 00:00:00.000','17:30')
INSERT INTO #T VALUES('1001', '2019-09-02 00:00:00.000','08:00')
INSERT INTO #T VALUES('1001', '2019-09-02 00:00:00.000','12:00')
INSERT INTO #T VALUES('1001', '2019-09-02 00:00:00.000','13:30')
INSERT INTO #T VALUES('1001', '2019-09-02 00:00:00.000','17:30')
INSERT INTO #T VALUES('1002', '2019-09-02 00:00:00.000','13:30')
INSERT INTO #T VALUES('1002', '2019-09-02 00:00:00.000','17:30')
SELECT Number,[Date],
substring(
replace (
replace (
replace (
','+MAX(CASE WHEN [time] >= '07:00' AND [time]<'09:00' THEN left([time],5) ELSE '' END)+
','+MAX(CASE WHEN [time] >= '11:00' AND [time]<'13:00' THEN left([time],5) ELSE '' END)+
','+MAX(CASE WHEN [time] >= '13:00' AND [time]<'14:30' THEN left([time],5) ELSE '' END)+
','+MAX(CASE WHEN [time] >= '16:30' AND [time]<'18:30' THEN left([time],5) ELSE '' END)
,',,',',')
,',,',',')
,',,',',')
,2,1000)
NewTime FROM #T
WHERE [Date]>='2019-09-01' and [DATE]<='2019-09-30' GROUP BY Number,[DATE]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/127300.html
標籤:疑難問題
上一篇:macen war
下一篇:單片機匯編語言程式
