Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:从2个表创建视图_Sql_Sql Server_View - Fatal编程技术网

SQL Server:从2个表创建视图

SQL Server:从2个表创建视图,sql,sql-server,view,Sql,Sql Server,View,我有两张桌子,一张有漏斗,里面的配料每天记录一次,或者在配料更换时记录 例如: Hoppers | Ingredients | Timestamp --------+---------------+---------------------- Hop_1 | Ing_A | 8/22/2016 06:00:00 Hop_2 | Ing_B | 8/22/2016 06:00:00 Name | Value

我有两张桌子,一张有漏斗,里面的配料每天记录一次,或者在配料更换时记录

例如:

Hoppers |  Ingredients  |   Timestamp
--------+---------------+----------------------
Hop_1   |  Ing_A        |   8/22/2016 06:00:00
Hop_2   |  Ing_B        |   8/22/2016 06:00:00
Name               |   Value  |   Timestamp
-------------------+----------+---------------------
Hop_1 Daily Total  |  100     |   8/22/2016 11:00:00
Hop_1 Run Total    |   30     |   8/22/2016 11:00:00
Hop_1 Ingredient | Hop_1 Daily | Hop_1 Run | Timestamp  
-----------------+-------------+-----------+-------------------
Ing_A            |      100    |      30   | 8/22/2016 11:00:00  
等等

我还有第二个表格,每小时记录每个料斗的使用总量

例如:

Hoppers |  Ingredients  |   Timestamp
--------+---------------+----------------------
Hop_1   |  Ing_A        |   8/22/2016 06:00:00
Hop_2   |  Ing_B        |   8/22/2016 06:00:00
Name               |   Value  |   Timestamp
-------------------+----------+---------------------
Hop_1 Daily Total  |  100     |   8/22/2016 11:00:00
Hop_1 Run Total    |   30     |   8/22/2016 11:00:00
Hop_1 Ingredient | Hop_1 Daily | Hop_1 Run | Timestamp  
-----------------+-------------+-----------+-------------------
Ing_A            |      100    |      30   | 8/22/2016 11:00:00  
等等

我想创建一个视图,显示每个料斗的产量,并说出名称

例如:

Hoppers |  Ingredients  |   Timestamp
--------+---------------+----------------------
Hop_1   |  Ing_A        |   8/22/2016 06:00:00
Hop_2   |  Ing_B        |   8/22/2016 06:00:00
Name               |   Value  |   Timestamp
-------------------+----------+---------------------
Hop_1 Daily Total  |  100     |   8/22/2016 11:00:00
Hop_1 Run Total    |   30     |   8/22/2016 11:00:00
Hop_1 Ingredient | Hop_1 Daily | Hop_1 Run | Timestamp  
-----------------+-------------+-----------+-------------------
Ing_A            |      100    |      30   | 8/22/2016 11:00:00  

很抱歉,如果它看起来不好,我对格式化是新手。您可以根据需要使用透视表。
这里有一个链接:

我并不认为这种结构是最好的主意,因为它需要动态sql通过几个循环和许多左自连接来实现。但你看:

IF OBJECT_ID('tempdb..#Ingredients') IS NOT NULL
    BEGIN
        DROP TABLE #Ingredients
    END

IF OBJECT_ID('tempdb..#Totals') IS NOT NULL
    BEGIN
        DROP TABLE #Totals
    END

CREATE TABLE #Ingredients (Hoppers VARCHAR(25), Ingredeients VARCHAR(25), [Timestamp] DATETIME)
CREATE TABLE #Totals (Name VARCHAR(50), Value INT, [Timestamp] DATETIME)

INSERT INTO #Ingredients (Hoppers, Ingredeients, [Timestamp])
VALUES ('Hop_1','Ing_A','8/22/2016 06:00:00'),('Hop_2','Ing_B','8/22/2016 06:00:00'),('Hop_3','Ing_C','8/22/2016 06:00:00')
INSERT INTO #Totals (Name, Value, [Timestamp])
VALUES ('Hop_1 Daily Total',100,'8/22/2016 11:00:00'),('Hop_1 Run Total',30,'8/22/2016 11:00:00'),('Hop_1 Run Total',60,'8/22/2016 09:00:00')
,('Hop_2 Daily Total',500,'8/22/2016 11:00:00'),('Hop_2 Run Total',10,'8/22/2016 11:00:00'),('Hop_2 Run Total',5,'8/22/2016 10:00:00')
,('Hop_3 Daily Total',400,'8/22/2016 11:00:00'),('Hop_3 Run Total',85,'8/22/2016 11:00:00'),('Hop_3 Run Total',65,'8/22/2016 10:00:00')


DECLARE @HopperCount INT
SELECT @HopperCount = COUNT(DISTINCT i.Hoppers)
FROM
    #Ingredients i
    INNER JOIN #Totals t
    ON t.Name LIKE i.Hoppers + '%'


DECLARE @I INT = 1
DECLARE @Sql NVARCHAR(MAX)

SET @Sql = '
;WITH cte AS (
    SELECT
       i.Hoppers
       ,i.Ingredeients
       ,Value
       ,t.[Timestamp]
       ,CASE WHEN t.Name LIKE ''%Daily%'' THEN 1 ELSE 0 END as IsDaily
       ,ROW_NUMBER() OVER (PARTITION BY i.Hoppers, t.name ORDER BY t.[Timestamp] DESC) as RunRowNum
       ,DENSE_RANK() OVER (PARTITION BY 1 ORDER BY i.Hoppers) as HooperNumber
    FROM
       #Ingredients i
       INNER JOIN #Totals t
       ON t.Name LIKE i.Hoppers + ''%''
       AND i.[Timestamp] <= t.[Timestamp]
)

SELECT
    c.Ingredeients AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Ingredient]
    ,SUM(CASE WHEN c.IsDaily = 1 THEN c.Value END) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Daily]
    ,SUM(CASE WHEN c.IsDaily = 0 THEN c.Value END) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Run]
    ,MAX(c.[Timestamp]) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Timestamp] '


SET @I = 2
WHILE @I <= ISNULL(@HopperCount,0)
BEGIN
    SET @Sql = @Sql + '
    ,c'+ CAST(@I AS VARCHAR(10)) +  '.Ingredeients AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Ingredient]
    ,SUM(CASE WHEN c'+ CAST(@I AS VARCHAR(10)) + '.IsDaily = 1 THEN c' + CAST(@I AS VARCHAR(10)) + '.Value END) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Daily]
    ,SUM(CASE WHEN c' + CAST(@I AS VARCHAR(10)) + '.IsDaily = 0 THEN c' + CAST(@I AS VARCHAR(10))+ '.Value END) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Run]
    ,MAX(c' + CAST(@I AS VARCHAR(10)) + '.[Timestamp]) AS [Hop_' + CAST(@I AS VARCHAR(10)) + ' Timestamp] '

    SET @I = @I + 1
END


SET @Sql = @Sql + '
FROM
    cte c '


SET @I = 2
WHILE @I <= ISNULL(@HopperCount,0)
BEGIN
    SET @Sql = @Sql + '
    LEFT JOIN cte c' + CAST(@I AS VARCHAR(10)) + ' 
    ON c.HooperNumber + ' + CAST(@I - 1 AS VARCHAR(10)) + ' = c' + CAST(@I AS VARCHAR(10)) + '.HooperNumber 
    AND c' + CAST(@I AS VARCHAR(10))+ '.RunRowNum = 1
    AND c.IsDaily = c' + CAST(@I AS VARCHAR(10)) + '.IsDaily '

    SET @I = @I + 1
END

SET @Sql = @Sql + '
WHERE
    c.HooperNumber = 1
    AND c.RunRowNum = 1
GROUP BY
    c.Ingredeients
'

SET @I = 2
WHILE @I <= ISNULL(@HopperCount,0)
BEGIN
    SET @Sql = @Sql + ',c' + CAST(@I AS VARCHAR(10)) + '.Ingredeients
    '

    SET @I = @I + 1
END

EXECUTE (@sql)

所以除了切掉Name列的第一部分之外,没有列可以连接这两个表?如果有超过1种成分,您如何确定哪种价值与哪种成分相关?如果您想要一个具有特定于hopper的列名的透视图,当存在多个hopper时,您会怎么做?添加其他列?是的,最终表格将是所有料斗和所有每日总计等。。我只是不想把它全部打印出来。。。我希望我能根据每张桌子上的时间戳对它们进行分组。。。但是时间戳并不相等,我的想法是加载daily total的值,运行total,然后使用该时间戳在另一个表中查找最近的时间戳。我只是不知道如何做到这一点。我之所以这样做,是因为我只是试图在以前创建的数据库中组织信息。很抱歉,Neal,您的评论没有解决我的问题,也许我没有很好地说明这些问题。1您如何将表格联系起来?那么,如果有超过1种成分,你如何知道Ing_A的值?2在最终表格中,每个料斗的附加列将如何表示料斗?你在网站上没有得到太多的关注,可能是因为你的问题没有回答一些未知的问题,也可能是因为你没有表现出想要得到你想要的东西的企图,即使这种企图是远远没有实现的。表之间的关系,当料斗中的配料发生变化时,运行总数重置为0。新的成分是用时间戳输入数据库的,所以我应该根据时间戳知道。如果在上午11:30运行总数为500,我可以查看ingredeint where components.Timestamp