zoukankan      html  css  js  c++  java
  • NorthWind数据库中笛卡儿积的一个应用效果[可以作年度统计用]

    ALTER PROCEDURE dbo.ReturnAllMonthInOneYearTheSalesStatics
    /*
    (
    @parameter1 datatype = default value,
    @parameter2 datatype OUTPUT
    )
    */

    AS
    /* SET NOCOUNT ON */
    DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
    DECLARE @tblCustomers TABLE ( CustomerID CHAR(10),
    CompanyName
    VARCHAR(50),
    ContactName
    VARCHAR(50))
    DECLARE @tblFinal TABLE ( sMonth VARCHAR(7),
    CustomerID
    CHAR(10),
    CompanyName
    VARCHAR(50),
    ContactName
    VARCHAR(50),
    mSales
    MONEY)


    DECLARE @dtStartDate DATETIME,
    @dtEndDate DATETIME,
    @dtDate DATETIME,
    @i INTEGER

    SET @dtEndDate = '5/5/1997'

    SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
    VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' 23:59:59' AS DATETIME))
    SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)


    -- Get all months into the first table
    SET @i = 0
    WHILE (@i < 12)
    BEGIN
    SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
    INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +
    CASE
    WHEN MONTH(@dtDate) < 10
    THEN '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))
    ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))
    END AS sMonth
    SET @i = @i + 1
    END

    -- Get all clients who had sales during that period into the "y" table
    INSERT INTO @tblCustomers
    SELECT DISTINCT
    c.CustomerID,
    c.CompanyName,
    c.ContactName
    FROM Customers c
    INNER JOIN Orders o ON c.CustomerID = o.CustomerID
    WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate

    INSERT INTO @tblFinal
    SELECT m.sMonth,
    c.CustomerID,
    c.CompanyName,
    c.ContactName,
    0
    FROM @tblMonths m CROSS JOIN @tblCustomers c

    UPDATE @tblFinal SET
    mSales
    = mydata.mSales
    FROM @tblFinal f INNER JOIN
    (
    SELECT c.CustomerID,
    CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
    CASE WHEN MONTH(o.OrderDate) < 10
    THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
    ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
    END AS sMonth,
    SUM(od.Quantity * od.UnitPrice) AS mSales
    FROM Customers c
    INNER JOIN Orders o ON c.CustomerID = o.CustomerID
    INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
    WHERE o.OrderDate BETWEEN @dtStartDate AND @dtEndDate
    GROUP BY
    c.CustomerID,
    CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
    CASE WHEN MONTH(o.OrderDate) < 10
    THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
    ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
    END
    ) mydata
    on f.CustomerID = mydata.CustomerID AND f.sMonth =
    mydata.sMonth


    SELECT f.sMonth,
    f.CustomerID,
    f.CompanyName,
    f.ContactName,
    f.mSales
    FROM @tblFinal f
    ORDER BY
    f.CompanyName,
    f.sMonth

    RETURN

    本文来自博客园,作者:Slashout,转载请注明原文链接:https://www.cnblogs.com/SlashOut/archive/2005/04/20/142280.html 关注公众号:数字化转型

  • 相关阅读:
    Opengl编程指南第三章:视图
    OpenGL编程指南第四章:颜色
    OpenGL编程指南第七章:显示列表
    推荐:字体、排版简明入门
    OpenGL编程指南第八章:绘制像素、位图、字体和图像
    推荐:字体、排版简明入门
    OpenGL编程指南第五章:光照
    转载一篇密码学基本介绍
    ARM_异常和中断学习笔记
    ARM指令学习笔记
  • 原文地址:https://www.cnblogs.com/SlashOut/p/142280.html
Copyright © 2011-2022 走看看