联合两个表的Sql查询

联合两个表的Sql查询

本文介绍了连接/联合两个表的Sql查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一些建议来构建连接表 A & 的查询.表 B 将输出作为表 C.看起来我需要能够合并两个表并构建交叉表查询.下面显示的数据只是示例,因为这两个表中的日期每个月都在变化.注意:两个表中的日期不会重叠.例如,下面的表 B 永远不会将 FutureDates 设为六月或七月.反之亦然

I am looking for some suggestions to build a query to join table A & table B to get the output as table C. It looks like I need to be able to union the two tables and build a cross tab query. The data shown below are just examples as the dates in the two tables would be changing every month. Note: the dates in the two tables will not overlap. For example, below Table B will never have FutureDates as June or July. and vice-versa

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.如果您发现任何问题,请告诉我.

This has been tested in SQL Server 2008 R2. I believe everything here will work in 2005 as well. 2005, as far as I remember, introduced PIVOT and OVER among other things. If you find any problems just let me know.

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查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 22:00