2012-10-19 63 views
4

我在表中的數據爲波紋管查詢由日常出現的日化集團從對

SERVICE_ID DATE_SEQ DAY_SEQ 
101004   2012-10-18  1 
101004   2012-10-19  2 
101001   2012-10-20  3 
101004   2012-10-21  4 

我想查詢生成日期顯示爲範圍與日期{從對}它會通過服務ID組日期爲序,如果最終它顯示爲
輸出:

**Service_id**  **From-To**    **Date** 
101004  2012-10-18 - 2012-10-19   1-2 
101001  2012-10-20 - 2012-10-20   3-3 
101004  2012-10-21 - 2012-10-21   4-4 
+5

歡迎來到StackOverflow!爲了在這裏得到積極的迴應,請顯示你的嘗試。 –

+3

** SQL **只是*結構化查詢語言* - 許多數據庫系統使用的語言,而不是數據庫產品。許多東西都是特定於供應商的 - 所以我們真的需要知道您使用的數據庫系統(以及哪個版本)(如MySQL,SQL Server等)。 – hims056

+0

@ user1758769您嘗試了我的迴應嗎? –

回答

2

試試這個

DECLARE @TB AS TABLE(
    SERVICE_ID INTEGER, 
    DATE_SEQ SMALLDATETIME, 
    DAY_SEQ NVARCHAR(10), 
    FARE_SUP_ID INT 
) 

INSERT INTO @TB VALUES 
    (101004,'2012-10-18 00:00:00',1,267), 
    (101001,'2012-10-19 00:00:00',2,171), 
    (101004,'2012-10-20 00:00:00',3,267), 
    (101004,'2012-10-21 00:00:00',4,171), 
    (101001,'2012-10-22 00:00:00',5,171), 
    (101001,'2012-10-23 00:00:00',6,171), 
    (101004,'2012-10-24 00:00:00',7,267) 

SELECT * fROM @TB 

;WITH TB1 AS (


SELECT 
    T1.SERVICE_ID, 
    MIN(T1.DATE_SEQ) AS CHECK_IN, 
    MAX(T2.DATE_SEQ) AS CHECK_OUT, 
    MIN (T1.DAY_SEQ) + ' - ' + MAX(T2.DAY_SEQ) AS DAY_SEQ, 
    MAX(T1.FARE_SUP_ID) AS FARE_SUP_ID, 
    1 AS DIFF 
    FROM @TB T1 INNER JOIN @TB T2 
    ON T1.SERVICE_ID = T2.SERVICE_ID 
    WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1 
    GROUP BY 
    T1.SERVICE_ID 

UNION ALL 

SELECT T3.SERVICE_ID,T3.DATE_SEQ AS CHECK_IN ,T4.DATE_SEQ AS CHECK_OUT 
    ,T3.DAY_SEQ,T3.FARE_SUP_ID,DATEDIFF(DY, T3.DATE_SEQ ,T4.DATE_SEQ) AS DIFF 
    FROM @TB T3 INNER JOIN @TB T4 
    ON T3.SERVICE_ID = T4.SERVICE_ID 
    WHERE DATEDIFF(DY, T3.DATE_SEQ ,T4.DATE_SEQ) = 0 
    AND 
    T3.DATE_SEQ NOT IN (
     SELECT T1.DATE_SEQ 
     FROM @TB T1 INNER JOIN @TB T2 
      ON T1.SERVICE_ID = T2.SERVICE_ID 
     WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1 
    ) 
    AND 
     T4.DATE_SEQ NOT IN (
     SELECT T2.DATE_SEQ 
      FROM @TB T1 INNER JOIN @TB T2 
      ON T1.SERVICE_ID = T2.SERVICE_ID 
      WHERE DATEDIFF(DY, T1.DATE_SEQ ,T2.DATE_SEQ) = 1 
    ) 
) 
SELECT 
    * 
    FROM TB1 
    ORDER BY DAY_SEQ 
0

試試這個,這個想法是基於主查詢的ID在主運行查詢的內層查詢:

select 
SERVICE_ID, 
(select cast(min(DATE_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) + ' - ' +(select cast(min(DATE_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) as FROM_TO, 
(select cast(min(DAY_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) + ' - ' +(select cast(min(DAY_SEQ) AS VARCHAR(20)) from my_table where SERVICE_ID = mt.SERVICE_ID) as DATE 
from my_table mt 
0

我可能不知道這個問題。

(的CONCAT()函數是DBMS依賴,你可能需要轉換日期,文本)「按組」查詢

這似乎是一個直截了當:

SELECT Service_id, 
CONCAT(MIN_DATE," - ", MAX_DATE) AS FromTo, 
CONCAT(MIN_SEQ," - ", MAX_SEQ) AS Date 
FROM 
(
    SELECT Service_id, 
    MIN(DATE_SEQ) AS MIN_DATE, 
    MAX(DATE_SEQ) AS MAX_DATE, 
    MIN(DAY_SEQ) AS MIN_SEQ, 
    MAX(DAY_SEQ) AS MAX_SEQ 
    FORM YOUR_TABLE 
    GROUP BY Service_id) AS A 

希望幫助!

+1

它返回不同的結果集。請確認。 –

0

我在第二個表中人爲地將其縮減爲一個序列,因爲那樣會加入表格。

SELECT CASE WHEN (t1.service_id = t2.service_id) THEN t1.service_id ELSE t2.service_id END AS service_id, 
     CASE WHEN (t1.service_id = t2.service_id) THEN CAST(t1.date_seq AS nvarchar(10)) + ' - ' + CAST(t2.date_seq AS nvarchar(10)) 
               ELSE CAST(t2.date_seq AS nvarchar(10)) + ' - ' + CAST(t2.date_seq AS nvarchar(10)) END AS date_seq, 
     CASE WHEN (t1.service_id = t2.service_id) THEN CAST(t1.day_seq AS nvarchar(10)) + ' - ' + CAST(t2.day_seq AS nvarchar(10)) 
               ELSE CAST(t2.day_seq AS nvarchar(10)) + ' - ' + CAST(t2.day_seq AS nvarchar(10)) END AS day_seq                
FROM dbo.test28 t1 INNER JOIN dbo.test28 t2 ON t1.day_seq = t2.day_seq - 1 
0

將按照一定的工作(即使天之間缺少) -

--STEP 1. CREATE DUMMY TABLE WITH DUPLICATE_SEQ COLUMN. YOU MAY ADD ONE MORE COLUMN IN 
--SAME TABLE 
DECLARE @TABLE TABLE (SERVICE_ID INT, DATE_SEQ DATETIME, DAY_SEQ INT, DUPLICATE_SEQ INT DEFAULT(0)) 

INSERT INTO @TABLE(SERVICE_ID, DATE_SEQ, DAY_SEQ) VALUES 
(101004,   '2012-10-18',  1), 
(101004,   '2012-10-19',  2), 
(101001,   '2012-10-20',  3), 
(101004,   '2012-10-21',  4) 

--STEP 2. LOGIC TO UPDATE TABLE WITH DUPLICATE_SEQ VALUE FOR SEQUENTIAL DUPLICATES ONLY 
DECLARE @PREVIOUS_SERVICE_ID INT 
DECLARE @DUPLICTE_COUNTER INT = 1 

SET @PREVIOUS_SERVICE_ID = (SELECT TOP 1 SERVICE_ID FROM @TABLE) 

UPDATE @TABLE 
SET 
DUPLICATE_SEQ = @DUPLICTE_COUNTER 
,@DUPLICTE_COUNTER = CASE WHEN @PREVIOUS_SERVICE_ID = SERVICE_ID THEN @DUPLICTE_COUNTER ELSE @DUPLICTE_COUNTER + 1 END 
,@PREVIOUS_SERVICE_ID = CASE WHEN @PREVIOUS_SERVICE_ID = SERVICE_ID THEN @PREVIOUS_SERVICE_ID ELSE SERVICE_ID END 

--STEP 3. LOGIC TO UPDATE TABLE WITH DUPLICATE_SEQ VALUE FOR SEQUENTIAL DUPLICATES ONLY  
SELECT SERVICE_ID AS 'Service_id' 
    , CONVERT(CHAR(10), MIN(DATE_SEQ), 126) + ' - ' + CONVERT(CHAR(10), MAX(DATE_SEQ), 126) AS 'From-To' 
    , CAST(MIN(DAY_SEQ) AS VARCHAR(10)) + ' - ' + CAST(MAX(DAY_SEQ) AS VARCHAR(10)) AS 'Date' 
FROM @TABLE 
GROUP BY DUPLICATE_SEQ, SERVICE_ID 
ORDER BY 3 ASC 

輸出-

Service_id From-To      Date 
101004  2012-10-18 - 2012-10-19  1 - 2 
101001  2012-10-20 - 2012-10-20  3 - 3 
101004  2012-10-21 - 2012-10-21  4 - 4 
+0

非常感謝您的回答,嘗試從您的腳本是非常篦,但我有問題,如果我從下面添加數據爲 (101004,'2012-10-18',1), (101004,'2012- (101001,'2012-10-20',3), (101001,'2012-10-21',4), (101002,'2012-10-22',10-19',2), 5), (101004, '2012年10月23日',6), (101004, '2012年10月24日',7) 導致仍然顯示不正確.. 謝謝 – user1758769

+0

我有上面修改了UPDATE @TABLE語句。請確認。 –

+0

我已經驗證了新的輸入。對你起作用嗎? –