簡體   English   中英

需要SQL查詢幫助-第一個表中的多行應與第二個表中的多個表匹配

[英]SQL Query help needed - Multiple rows in 1st table should match to multiple table in 2nd table

問題插圖我試圖找到一個神奇的查詢來生成摘要信息。 我已將我的問題映射到虛擬插圖中。 我有“ WaterLeakage%”表,該表記錄了幾年來酒店房間發生的泄漏。

我有另一個表,該表記錄每個表的升水量。

現在,我必須找到在給定日期范圍內給定房間號的實際漏水升數。

基本上我必須將“ WaterLeakage%”表中的幾行分組為“ WaterConsumption”表中的幾行。 我試圖找出神奇的高效查詢來找到這個。 找不到它,請幫忙。

DECLARE @START_DATE_PARAM DATE = '01/10/2017';
DECLARE @END_DATE_PARAM DATE = '01/31/2017';
DECLARE @ROOM_NUMBER INT = 101;

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#WATER_CONSUMPTION'))
    DROP TABLE #WATER_CONSUMPTION;  
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#WATER_LEAKAGE_PER'))
    DROP TABLE #WATER_LEAKAGE_PER;

--Table for daily daily water consumption per room
CREATE TABLE #WATER_CONSUMPTION(
ROOM_NUMBER INT,
UDAY DATE,
WATER_CONSUMPTION_LITER INT
)

--Table for water leakage percent per room for date range
CREATE TABLE #WATER_LEAKAGE_PER
(
ROOM_NUMBER INT,
START_DATE DATE,
END_DATE DATE,
WATER_LEAKAGE_PERCENT INT
)

-- Raw Data
INSERT INTO #WATER_LEAKAGE_PER(ROOM_NUMBER,START_DATE,END_DATE,WATER_LEAKAGE_PERCENT) 
VALUES(101,'2017/01/01','2017/01/02',5),
(102,'2017/01/01','2017/01/05',10),
(101,'2017/01/04','2017/02/06',10);

-- Raw Data
INSERT INTO #WATER_CONSUMPTION 
VALUES(101,'2017/01/01',100),
(101,'2017/01/02',100),
(101,'2017/01/03',100),
(101,'2017/01/04',100),
(101,'2017/01/05',100),
(101,'2017/01/06',100),
(102,'2017/01/01',100),
(102,'2017/01/02',100),
(102,'2017/01/03',100),
(102,'2017/01/04',100),
(102,'2017/01/05',100);

DECLARE @TotalLeak REAL = 0;
SELECT * FROM #WATER_CONSUMPTION;
SELECT * FROM #WATER_LEAKAGE_PER;

SELECT * FROM #WATER_CONSUMPTION T1 JOIN (SELECT * FROM #WATER_LEAKAGE_PER WHERE ROOM_NUMBER=@ROOM_NUMBER) T2
ON (T1.ROOM_NUMBER=T2.ROOM_NUMBER AND T1.UDAY >= T2.START_DATE AND T1.UDAY <= T2.END_DATE);

DROP TABLE #WATER_CONSUMPTION;
DROP TABLE #WATER_LEAKAGE_PER;

我現在非常接近解決方案。 基本上我改變了主意。 我現在將加入反向。

    BEGIN
    --Input Parameters for calculating water wastage between date range
    DECLARE @START_DATE_PARAM DATE = '01/10/2017';
    DECLARE @END_DATE_PARAM DATE = '01/31/2017';

    --Table for daily daily water consumption per room
    CREATE TABLE #WATER_CONSUMPTION(
    ROOM_NUMBER INT,
    UDAY DATE,
    WATER_CONSUMPTION_LITER INT
    )

    --Table for water leakage percent per room for date range
    CREATE TABLE #WATER_LEAKAGE_PER
    (
    ROOM_NUMBER INT,
    START_DATE DATE,
    END_DATE DATE,
    WATER_LEAKAGE_PERCENT INT,
    LEAKAGE_PER_DAY_IN_LITER INT
    )

    -- Leakage in liter per room for each day, This will have multiple entries for room and date if room number and date is available in multiple date ranges, ex. in #WATER_CONSUMPTION table for room number 101 we have multiple entries with overlapping dates
    CREATE TABLE #DAY_WISE_LEAKAGE
    (
    ROOM_NUMBER INT,
    LDATE DATE,
    LEAKAGE_IN_LITER INT
    )


    -- Raw Data
    INSERT INTO #WATER_LEAKAGE_PER(ROOM_NUMBER,START_DATE,END_DATE,WATER_LEAKAGE_PERCENT) 
    VALUES(101,'2017/01/15','2017/01/18',30),
    (102,'2017/01/15','2017/01/18',10),
    (101,'2017/01/15','2017/02/13',5);

    -- Raw Data
    INSERT INTO #WATER_CONSUMPTION 
    VALUES(101,'01/01/2017',1001),
    (101,'01/02/2017',1001),
    (101,'01/03/2017',1001),
    (101,'01/04/2017',1001),
    (101,'01/05/2017',1001),
    (101,'01/06/2017',1001),
    (101,'01/07/2017',1001),
    (101,'01/08/2017',1001),
    (101,'01/09/2017',1001),
    (101,'01/10/2017',1001),
    (101,'01/11/2017',1001),
    (101,'01/12/2017',1001),
    (101,'01/13/2017',1001),
    (101,'01/14/2017',1001),
    (101,'01/15/2017',1001),
    (101,'01/16/2017',1001),
    (101,'01/17/2017',1001),
    (101,'01/18/2017',1001),
    (101,'01/19/2017',1001),
    (101,'01/20/2017',1001),
    (101,'01/21/2017',1001),
    (101,'01/22/2017',1001),
    (101,'01/23/2017',1001),
    (101,'01/24/2017',1001),
    (101,'01/25/2017',1001),
    (101,'01/26/2017',1001),
    (101,'01/27/2017',1001),
    (101,'01/28/2017',1001),
    (101,'01/29/2017',1001),
    (101,'01/30/2017',1001),
    (101,'01/31/2017',1001);



    DECLARE @ROOM_NUMBER INT
    DECLARE @START_DATE DATE
    DECLARE @END_DATE DATE
    DECLARE @WATER_LEAKAGE_PERCENT INT

    -- cursor for calculating water wastage pre date range per day available in  #WATER_LEAKAGE_PER table
    DECLARE WATER_LEAKAGE_PER_CURSOR CURSOR FOR   
    SELECT ROOM_NUMBER,START_DATE,END_DATE,WATER_LEAKAGE_PERCENT FROM  #WATER_LEAKAGE_PER

    OPEN WATER_LEAKAGE_PER_CURSOR  

    FETCH NEXT FROM WATER_LEAKAGE_PER_CURSOR   
    INTO @ROOM_NUMBER, @START_DATE ,@END_DATE,  @WATER_LEAKAGE_PERCENT

    WHILE @@FETCH_STATUS = 0  
    BEGIN   
            DECLARE @TOTAL_WATER_USED_FOR_DATE_RANGE INT=0;
            DECLARE @NUMBER_OF_DAYS INT=0;
            DECLARE @LEAKAGE_PER_DAY_IN_LITER INT=0;

            -- Total Liters of water used for 1 date range 
            SELECT @TOTAL_WATER_USED_FOR_DATE_RANGE =SUM(WATER_CONSUMPTION_LITER),@NUMBER_OF_DAYS=COUNT(1) FROM #WATER_CONSUMPTION WHERE ROOM_NUMBER=@ROOM_NUMBER AND UDAY BETWEEN @START_DATE AND @END_DATE;

            -- Liters of water leakage per day for selevted date range in cursor
            SELECT @LEAKAGE_PER_DAY_IN_LITER=((@TOTAL_WATER_USED_FOR_DATE_RANGE*@WATER_LEAKAGE_PERCENT)/100)/@NUMBER_OF_DAYS;
            UPDATE #WATER_LEAKAGE_PER SET LEAKAGE_PER_DAY_IN_LITER = @LEAKAGE_PER_DAY_IN_LITER WHERE ROOM_NUMBER=@ROOM_NUMBER AND START_DATE = @START_DATE AND END_DATE=@END_DATE AND WATER_LEAKAGE_PERCENT=@WATER_LEAKAGE_PERCENT;

            -- generate dates and water leakage, this will be used for actual calculation of water leakage in date range.
            ;WITH n AS 
            (
                SELECT TOP (DATEDIFF(DAY, @START_DATE, @END_DATE) + 1) 
                n = ROW_NUMBER() OVER (ORDER BY [object_id])
                FROM sys.all_objects
            )
            INSERT INTO #DAY_WISE_LEAKAGE SELECT @ROOM_NUMBER, DATEADD(DAY, n-1, @START_DATE),@LEAKAGE_PER_DAY_IN_LITER
            FROM n;

     FETCH NEXT FROM WATER_LEAKAGE_PER_CURSOR   
        INTO @ROOM_NUMBER, @START_DATE ,@END_DATE, @WATER_LEAKAGE_PERCENT  
    END   
    CLOSE WATER_LEAKAGE_PER_CURSOR;  
    DEALLOCATE WATER_LEAKAGE_PER_CURSOR; 

    -- Average of Liters of water leakage per Room number.
    SELECT ROOM_NUMBER,SUM(LEAKAGE_IN_LITER) FROM #DAY_WISE_LEAKAGE WHERE LDATE BETWEEN @START_DATE_PARAM AND  @END_DATE_PARAM GROUP BY ROOM_NUMBER;

    DROP TABLE #WATER_CONSUMPTION;
    DROP TABLE #WATER_LEAKAGE_PER;
    DROP TABLE #DAY_WISE_LEAKAGE

    END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM