首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要SQL查询帮助-第一个表中的多行应与第二个表中的多个表匹配

需要SQL查询帮助-第一个表中的多行应与第二个表中的多个表匹配
EN

Stack Overflow用户
提问于 2017-04-06 10:34:31
回答 2查看 46关注 0票数 0

Problem Illustration我正在尝试找到那个神奇的查询来生成摘要信息。我已经将我的问题映射到虚构的插图中。我有一个'WaterLeakage%‘表,它记录了几年来酒店房间里发生的漏水事件。

我有另一个表,它以升记录每个表的WaterConsumption。

现在我必须找出给定房间号在给定日期范围内的实际渗漏水(升)。

基本上,我必须将'WaterLeakage%‘表中的几行分组到'WaterConsumption’表中的几行。我正在试着找出神奇的高效查询来找到它。找不到,请帮助。

EN

回答 2

Stack Overflow用户

发布于 2017-04-07 16:25:49

代码语言:javascript
复制
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;

我现在已经非常接近解决方案了。基本上我改变了我的想法。我现在要加入reverse了。

票数 1
EN

Stack Overflow用户

发布于 2017-04-06 18:37:39

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43244695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档