【问题标题】:help creating a complicated stored procedure帮助创建复杂的存储过程
【发布时间】:2011-04-21 14:57:56
【问题描述】:

所以我什至不确定这是否可能,但学习并能够做到这一点真的很棒。

我要做的是运行 3 个单独的查询,它们返回单行数据并创建一个表,然后可以在 asp.net 的 gridview 中使用该表

查询 1

SELECT     dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT
(dbo.BOOKINGS.USERID) AS bookingcount
FROM         dbo.BOOKINGS INNER JOIN
             dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
             dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
@enddate)) AND (dbo.MAJOR.SDESCR = 'Cruises') AND 
                      (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
GROUP BY dbo.BOOKINGS.USERID

查询 2

SELECT     dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT
    (dbo.BOOKINGS.USERID) AS bookingcount
FROM         dbo.BOOKINGS INNER JOIN
                      dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
                      dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
    @enddate)) AND (dbo.MAJOR.SDESCR <> 'Cruises') AND 
                      (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
GROUP BY dbo.BOOKINGS.USERID

查询 3

SELECT     SUM(dbo.SUBS.AMOUNT) AS total, COUNT(dbo.SUBS.AMOUNT) AS Memberships, 
    dbo.HOMES.USERID
FROM         dbo.HOMES INNER JOIN
                      dbo.SUBS ON dbo.HOMES.HOME = dbo.SUBS.HOME AND dbo.HOMES.JOINED 
    = dbo.SUBS.PAIDON
WHERE     (dbo.HOMES.JOINED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
    @enddate)) AND (dbo.HOMES.USERID = 
    @USER)
GROUP BY dbo.HOMES.USERID

所有 thre 查询都返回包含 3 列的单行 所以我认为这可能会起作用,唯一困难的部分是我想添加一个新列

query1 userid  total1   bookingcount
query2 userid  total2   bookingcount
query3 userid  total3   memberships

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    您可以使用 UNION 语句执行此操作,您所要做的就是让 3 个 select 语句以相同的顺序返回相同数量的字段

    SELECT     'QUERY1' AS QUERYNAME, dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT(dbo.BOOKINGS.USERID) AS TOTAL2
    FROM         dbo.BOOKINGS INNER JOIN
                 dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
                 dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
    WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
    @enddate)) AND (dbo.MAJOR.SDESCR = 'Cruises') AND 
                          (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
    GROUP BY dbo.BOOKINGS.USERID
    
    UNION ALL
    
    SELECT     'QUERY2' AS QUERYNAME, dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT(dbo.BOOKINGS.USERID) AS TOTAL2
    FROM         dbo.BOOKINGS INNER JOIN
                          dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
                          dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
    WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
        @enddate)) AND (dbo.MAJOR.SDESCR <> 'Cruises') AND 
                          (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
    GROUP BY dbo.BOOKINGS.USERID
    
    UNION ALL
    
    SELECT         'QUERY3' AS QUERYNAME, dbo.HOMES.USERID, SUM(dbo.SUBS.AMOUNT) AS total, COUNT(dbo.SUBS.AMOUNT) AS TOTAL2
    FROM         dbo.HOMES INNER JOIN
                          dbo.SUBS ON dbo.HOMES.HOME = dbo.SUBS.HOME AND dbo.HOMES.JOINED 
        = dbo.SUBS.PAIDON
    WHERE     (dbo.HOMES.JOINED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
        @enddate)) AND (dbo.HOMES.USERID = 
        @USER)
    GROUP BY dbo.HOMES.USERID
    

    【讨论】:

    • 没想到这么简单哈哈
    • 感谢它运行良好,我唯一的问题是如果用户没有查询 3 的数据,它只是不显示该行,如果没有出现,我如何插入 0
    【解决方案2】:

    这看起来像一个标准的 UNION - 尽管您需要以相同的顺序排列列。科学来了(这会很长)

    SELECT  'query1',   dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT
    (dbo.BOOKINGS.USERID) AS bookingcount
    FROM         dbo.BOOKINGS INNER JOIN
                 dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
                 dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
    WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
    @enddate)) AND (dbo.MAJOR.SDESCR = 'Cruises') AND 
                          (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
    GROUP BY dbo.BOOKINGS.USERID
    UNION
    SELECT    'query2', dbo.BOOKINGS.USERID, SUM(dbo.BOOKINGS.APRICE) AS total, COUNT
        (dbo.BOOKINGS.USERID) AS bookingcount
    FROM         dbo.BOOKINGS INNER JOIN
                          dbo.TOURS ON dbo.BOOKINGS.TOUR = dbo.TOURS.TOUR INNER JOIN
                          dbo.MAJOR ON dbo.TOURS.MAJOR = dbo.MAJOR.MAJOR
    WHERE     (dbo.BOOKINGS.BOOKED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
        @enddate)) AND (dbo.MAJOR.SDESCR <> 'Cruises') AND 
                          (dbo.BOOKINGS.USERID = @USER) AND (dbo.MAJOR.DIVISION = 'A')
    GROUP BY dbo.BOOKINGS.USERID
    UNION
    SELECT  'query3',dbo.HOMES.USERID, SUM(dbo.SUBS.AMOUNT) AS total, 
            COUNT(dbo.SUBS.AMOUNT) AS Memberships    
    FROM         dbo.HOMES INNER JOIN
                          dbo.SUBS ON dbo.HOMES.HOME = dbo.SUBS.HOME AND dbo.HOMES.JOINED 
        = dbo.SUBS.PAIDON
    WHERE     (dbo.HOMES.JOINED BETWEEN CONVERT(int, @startdate) AND CONVERT(int, 
        @enddate)) AND (dbo.HOMES.USERID = 
        @USER)
    GROUP BY dbo.HOMES.USERID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 2019-09-06
      • 1970-01-01
      • 2021-11-30
      • 2012-10-04
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多