помочь создать сложную хранимую процедуру - PullRequest
0 голосов
/ 21 апреля 2011

Так что я даже не уверен, возможно ли это, но действительно было бы здорово узнать и уметь это делать.

Я пытаюсь выполнить 3 отдельных запроса, которые возвращают одинстрока данных и создать единую таблицу, которая затем может быть использована в виде сетки в asp.net

запрос 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

все три запроса возвращают одну строку с 3 столбцами, так что я думаю, это может сработать, единственная другая сложная часть - это я хочу добавить новый столбец

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Вы можете сделать это с помощью оператора 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
1 голос
/ 21 апреля 2011

это выглядит как стандартный 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
...