【问题标题】:How do I create a third table from two tables?如何从两个表中创建第三个表?
【发布时间】:2010-08-13 09:08:43
【问题描述】:

我有两张很棒的桌子,我想用它们作为第三张桌子的基础!

输出取决于日期间隔,例如 09/01/2010 - 09/03/2010

表 A 的输出示例 - -(ALLOCATED 测试人员)

Date            Country        Allocated testers
09/01/2010      Nigeria           0
09/02/2010      Nigeria           1
09/03/2010      Nigeria         134

09/01/2010      China             2
09/02/2010      China             0
09/03/2010      China            14

09/01/2010      Chile             3
09/02/2010      Chile             4
09/03/2010      Chile             0

*************

表 B 的输出示例 - -(缺席 测试人员)

Date            Country        Absent testers
09/01/2010      Nigeria           0
09/02/2010      Nigeria           7
09/03/2010      Nigeria           0

09/01/2010      China             2
09/02/2010      China             0
09/03/2010      China             0

09/01/2010      Chile             1
09/02/2010      Chile             0
09/03/2010      Chile             0

*************

表 C 的 WANTED 输出示例(分配和不存在的测试人员)

Date            Country        Allocated testers    Absent testers
09/01/2010      Nigeria           0                 0
09/02/2010      Nigeria           1                 7
09/03/2010      Nigeria         134                 0

09/01/2010      China             2                 2
09/02/2010      China             0                 0
09/03/2010      China            14                 0

09/01/2010      Chile             3                 2
09/02/2010      Chile             4                 0
09/03/2010      Chile             0                 0

这是一些生成上述输出的 SQL 代码...(是的,它们可以工作)

表 A

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
     UNION ALL
     SELECT     DATEADD(d, 1, Date) AS Expr1
     FROM         Calendar AS Calendar_1
     WHERE     (DATEADD(d, 1, Date) < @EndDate))
    SELECT     C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
     FROM         Calendar AS C CROSS JOIN
                            Country AS C2 LEFT OUTER JOIN
                            Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
     GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)

表 B

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
     UNION ALL
     SELECT     DATEADD(d, 1, Date) AS Expr1
     FROM         Calendar AS Calendar_1
     WHERE     (DATEADD(d, 1, Date) < @EndDate))
    SELECT     C.Date, C2.Country, COALESCE (COUNT(PA.PeopleID), 0) AS [Absent testers]
     FROM         Calendar AS C CROSS JOIN
                            Country AS C2 INNER JOIN
                            Roles AS R INNER JOIN
                            People AS P ON R.RolesID = P.RolesID ON C2.CountryID = P.CountryID LEFT OUTER JOIN
                            PeoplesAbsence AS PA ON C.Date BETWEEN PA.StartDate AND PA.EndDate AND P.PeopleID = PA.PeopleID
     WHERE     (R.Role = 'Tester')
     GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)

表 C 是我需要帮助创建的表 C :-)

注意:我想看一些示例代码,以便开始使用!

还请注意:我不想用 SQL Server 中的视图来解决这个问题,因为它不起作用... - 我需要那个 3:rd 表 ;-)


已解决!tdammers 那里得到了解决方案(谢谢!),这就是实施时的样子:

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
UNION ALL
SELECT
    DATEADD(d, 1, Date) AS Expr1
FROM
    Calendar AS Calendar_1
WHERE
    (DATEADD(d, 1, Date) < @EndDate))


SELECT a.Date, a.Country, a.[Allocated testers], b.[Absent testers] FROM ( SELECT
    C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM
    Calendar AS C
CROSS JOIN
    Country AS C2
LEFT OUTER JOIN
    Requests AS R 
    ON
        C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
GROUP BY
    C.Date, C2.Country ) as a LEFT OUTER JOIN ( SELECT     C.Date, C2.Country, COALESCE (COUNT(PA.PeopleID), 0) AS [Absent testers]
     FROM         Calendar AS C CROSS JOIN
                            Country AS C2 INNER JOIN
                            Roles AS R INNER JOIN
                            People AS P ON R.RolesID = P.RolesID ON C2.CountryID = P.CountryID LEFT OUTER JOIN
                            PeoplesAbsence AS PA ON C.Date BETWEEN PA.StartDate AND PA.EndDate AND P.PeopleID = PA.PeopleID
     WHERE     (R.Role = 'Tester')
     GROUP BY C.Date, C2.Country ) as b ON a.date = b.date AND a.country = b.country

【问题讨论】:

    标签: sql visual-studio-2008 sql-server-2005


    【解决方案1】:

    表 C 不应该是一个表,而应该是一个视图。

    【讨论】:

    • 哦,等等,算了。前两个也不是表,它们只是选择查询。我认为您实际上并不知道 SQL 表是什么。至于你原来的问题: - 从第一个查询创建一个视图 - 从第二个查询创建一个视图 - 在两个视图上使用 join 来累积查询 C 所需的输出
    • OK - 我承认它们是选择查询!我之前只是开玩笑的。问题是我想要第三个选择查询,而不是视图。因为我不能创建它们的视图,因为它们包含参数,所以我必须创建用户定义的函数,这对我来说现在似乎很多 - 所以给我一个关于如何设计第三个查询的提示和别再谈论意见了! ;-) 而且我实际上知道什么是 SQL 表,问题是我不知道它不是什么 - 但感谢您整理出来。我保证,我永远不会再将选择查询称为表!
    • 对。您可以将它们放入子查询中,然后对它们执行连接,而不是将前两个查询放入视图中。尽管您的查询严重暗示了一个非常糟糕的数据库设计 - 使用正确规范化的架构,这将非常容易。
    • 类似:SELECT a.date, a.country, a.num, b.num FROM (/* first subquery here /) as an INNER JOIN (/ second这里的子查询 */ ) as b ON a.date = b.date AND a.country = b.country
    • 完全一样,只是没有 SUM()。
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2016-04-28
    • 2014-03-16
    相关资源
    最近更新 更多