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