Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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查询_Sql_Sql Server 2005_Tsql_Stored Procedures - Fatal编程技术网

连接/联合两个表的Sql查询

连接/联合两个表的Sql查询,sql,sql-server-2005,tsql,stored-procedures,Sql,Sql Server 2005,Tsql,Stored Procedures,我正在寻找一些建议,以构建一个查询来连接表a和表B,从而将输出作为表C。看起来我需要能够合并这两个表并构建一个跨表查询。下面显示的数据只是示例,因为两个表中的日期每个月都在变化。注:两个表中的日期不会重叠。例如,下表B的未来日期永远不会是6月或7月。反之亦然 Table A Product Location HistoryDate HistorySales ... more columns A X June 100 A X

我正在寻找一些建议,以构建一个查询来连接表a和表B,从而将输出作为表C。看起来我需要能够合并这两个表并构建一个跨表查询。下面显示的数据只是示例,因为两个表中的日期每个月都在变化。注:两个表中的日期不会重叠。例如,下表B的未来日期永远不会是6月或7月。反之亦然

Table A
Product Location HistoryDate HistorySales ... more columns
 A         X         June      100
 A         X         July      200

Table B
Product Location FutureDate FutureSales   ... more columns
 A         X         August    150
 A         X         Sept      50

Table C
Product Location June July August September ... other columns from A & B
 A         X     100  200    150    50

感谢您的帮助。

这已经在SQL Server 2008 R2中进行了测试。我相信这里的一切在2005年也会起作用。据我记忆所及,2005年推出了PIVOT和OVER等产品。如果你发现任何问题就告诉我

DECLARE @Products TABLE
(
    ID INT IDENTITY(1, 1)
    , Name VARCHAR(30)
);

INSERT INTO @Products
VALUES ('Dummies Guide to Querying'), ('SQL Design Patterns');

DECLARE @OldProducts TABLE
(
    ID INT IDENTITY(1, 1)
    , ProductID INT
    , Location CHAR(2)
    , HistoryDate DATE
    , Sales INT
);

INSERT INTO @OldProducts
VALUES (1, 'CO', '20100601', 100)
    , (1, 'CO', '20100701', 200)
    , (1, 'CA', '20100526', 150)
    , (2, 'CA', '20100601', 175);

DECLARE @NewProducts TABLE
(
    ID INT IDENTITY(1, 1)
    , ProductID INT
    , Location CHAR(2)
    , FutureDate DATE
    , PredictedSales INT
);

INSERT INTO @NewProducts
VALUES (1, 'CO', '20110401', 200)
    , (1, 'CO', '20110601', 250)
    , (1, 'CA', '20110401', 150)
    , (2, 'CA', '20110301', 180)
    , (3, 'WA', '20110301', 100);

WITH AllProduts AS
(
    SELECT
        Products.Name
        , OldProducts.Location
        , DATENAME(MONTH, OldProducts.HistoryDate) AS MonthValue
        , OldProducts.Sales
    FROM @OldProducts AS OldProducts
    INNER JOIN @Products AS Products
        ON Products.ID = OldProducts.ProductID

    UNION ALL

    SELECT
        Products.Name
        , NewProducts.Location
        , DATENAME(MONTH, NewProducts.FutureDate) AS MonthValue
        , NewProducts.PredictedSales AS Sales
    FROM @NewProducts AS NewProducts
    INNER JOIN @Products AS Products
        ON Products.ID = NewProducts.ProductID
)
SELECT
    Name
    , Location
    , [January]
    , [Febuary]
    , [March]
    , [April]
    , [May]
    , [June]
    , [July]
    , [August]
    , [September]
    , [October]
    , [November]
    , [December]
FROM AllProduts
PIVOT
(
    SUM(Sales)
    FOR MonthValue
    IN
    (
        [January]
        , [Febuary]
        , [March]
        , [April]
        , [May]
        , [June]
        , [July]
        , [August]
        , [September]
        , [October]
        , [November]
        , [December]
    )
) PivotedTable
ORDER BY Name, Location;

您可能需要动态SQL,或者只需硬编码所有12个月,并使用空值,或者让Month1、Month2、Month3、Month4,然后以其他方式传回这些列所代表的内容。@Daniel,pivot正是他想要的。问题太模糊了。A/B中的日期是否表示为月份名称的字符串,并且每个月只有一条记录?如果A和B之间的记录“不会重叠”,那么A和B之间的记录永远不会超过12条吗?这并不明显,但我猜还有其他的产品+位置组合?考虑到C中的一行由A和B中的多行组成,您计划如何在C中显示“A和B中的其他列”-数据来自A/B中的哪一行?