【问题标题】:Creating a new table using data from two existing tables使用两个现有表中的数据创建新表
【发布时间】:2014-12-06 03:13:57
【问题描述】:

过去几天我一直在为此苦苦挣扎,但我所做的一切似乎都不起作用。任何帮助将不胜感激。这是一道家庭作业题,但我已经绞尽脑汁 3 天了,我的教授得到了零帮助。

我的困境是我正在尝试使用 Columns 和来自两个现有表的 Rows 创建一个全新的表。

问题如下:

使用 AP 数据库,创建一个名为“Invoices2Qtr2012”的新表,用于捕获供应商和 2012 年第二季度发票中以下属性的发票数据和 供应商表:VendorName、InvoiceNumber、InvoiceTotal、InvoiceDueDate、PaymentDate。

此外,添加一个新列,显示每张发票付款是按时还是延迟,以及 另一个新列显示哪个供应商每个月的发票最多。这个 应该只包括 2012 年第二季度的数据。

这是表格的结构:

发票:

InvoiceId
VendorID
InvoiceNumber
InvoiceDate
InvoiceTotal
PaymentTotal
CreditTotal
TermsID
InvoiceDue
PaymentDate

供应商:

VendorID
VendorName
VendorAddress1
VendorAddress2
VendorCity
VendorState
VendorZipCode
VendorPhone
VendorContactLName
VendorContactFName
DefaultTermsID
DefaultAccountNo

这是我目前的代码:

CREATE TABLE Invoices2Qtr2012 AS
SELECT VendorName, InvoiceNumber, InvoiceTotal, InvoiceDueDate, PaymentDate
FROM Invoices, Vendors
WHERE InvoiceDate BETWEEN '2012-03-31' AND '2012-07-01'

【问题讨论】:

  • 我觉得这个问题最棘手的是最后一部分:显示每个月哪个供应商的发票最多的列。该表不会有每个供应商的单一记录,那么他们希望您如何指出这一点?他们是否希望您仅在该供应商月记录最大的情况下添加 LargestThisMonth 列并在其中添加 True
  • 典型的家庭作业问题——让你解释歧义。
  • @roryap 这就是我的假设。我也讨厌这个问题的模棱两可。

标签: sql sql-server


【解决方案1】:

我确信它可以减少到更少的语句,它可能无法 100% 工作,但也许这可以让你开始或至少给你一些想法:

CREATE TABLE Invoices2Qtr2012 AS
SELECT VendorName, InvoiceNumber, InvoiceTotal, InvoiceDueDate, PaymentDate, InvoiceDate
FROM Invoices, Vendors
WHERE InvoiceDate BETWEEN '2012-03-31' AND '2012-07-01'

ALTER TABLE Invoices2Qtr2012
ADD LateOnTime varchar(255) DEFAULT 'On time'
ADD LargestInvoicePerMonth varchar(255) DEFAULT 'Not Largest'

UPDATE Invoices2Qtr2012
SET LateOnTime = 'Late'
WHERE PaymentDate > InvoiceDueDate;

UPDATE Invoices2Qtr2012
SET LargestInvoicePerMonth = 'Largest for April'
WHERE InvoiceTotal >= ALL (SELECT InvoiceTotal FROM Invoices2Qtr2012 WHERE InvoiceDate BETWEEN '2012-03-31' AND '2012-05-01')

UPDATE Invoices2Qtr2012
SET LargestInvoicePerMonth = 'Largest for May'
WHERE InvoiceTotal >= ALL (SELECT InvoiceTotal FROM Invoices2Qtr2012 WHERE InvoiceDate BETWEEN '2012-04-31' AND '2012-06-01')

UPDATE Invoices2Qtr2012
SET LargestInvoicePerMonth = 'Largest for June'
WHERE InvoiceTotal >= ALL (SELECT InvoiceTotal FROM Invoices2Qtr2012 WHERE InvoiceDate BETWEEN '2012-05-31' AND '2012-07-01')

【讨论】:

    【解决方案2】:

    SELECT INTO 语句将为您创建表。所以你的代码将是:

    SELECT INTO Invoices2Qtr2012  VendorName, InvoiceNumber, InvoiceTotal, InvoiceDueDate, PaymentDate
    FROM Invoices, Vendors
    WHERE InvoiceDate BETWEEN '2012-03-31' AND '2012-07-01'
    

    在此之后,我建议创建适当的索引、键和约束。

    表格 Invoices2Qtr2012 不得存在。

    【讨论】:

    • 附加列在哪里? “此外,包括一个显示每张发票付款是否按时或延迟的新列,以及另一个显示每个月哪个供应商拥有最大发票的新列。这应该只包括 2012 年第二季度的数据。”
    • 从问题来看,创建表似乎是一个问题。为此我的回答。
    猜你喜欢
    • 2012-11-08
    • 2022-06-16
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多