【问题标题】:Combine multiple SQL queries in SQL Server 2008 into a datatable on ASP.NET using C#使用 C# 将 SQL Server 2008 中的多个 SQL 查询组合到 ASP.NET 上的数据表中
【发布时间】:2015-08-12 23:56:50
【问题描述】:

我正在尝试将 2 个大 SQL 查询合并到一个数据表中,以便将其加载到网页上。

查询 #1:

select
    isnull(SALES_NUM4, '') SalesNo, 
    count(CUS_ID) NumOfCust, 
    count(distinct sales_num) NumOfRep
from 
    (select 
         SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
     from customer

     union

     select 
         SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
     from omsdata7.dbo.customer) a
where 
    SALES_NUM4 != '' and SLS_TYPE = '1'
group by 
    SALES_NUM4
order by 
    SALES_NUM4

查询 #2:

select 
    isnull(SALES_NUM4, '') SalesNo, 
    count(ORD_NUM) MTD_Ord, 
    convert(decimal(10, 2), sum(ORD_AMT)) MTD_Amt
from 
    (select 
         SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
     from orders

     union

     select 
         SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
     from omsdata7.dbo.orders) a
where 
    DATEADD(day, ORD_DT-4, '1801-01-01') >= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
    and DATEADD(day, ORD_DT-4, '1801-01-01') < getdate()
    and SALES_NUM4 != ''
group by 
    SALES_NUM4
order by 
    SALES_NUM4

【问题讨论】:

  • 您想使用 SQL Join 组合这 2 个查询,还是要将每个查询返回的数据表合并到 C# 中的 1 个数据表中?
  • @Code.me 我认为两种方式都可以,但我更喜欢组合查询方式,因为这样会减少 sql 连接时间。
  • @prashanth 问题是如何结合上面的两个查询?或者你可以在一个数据表中显示两个查询吗?

标签: c# asp.net sql-server datatable


【解决方案1】:

也许这会奏效。我正在加入子查询。

select  isnull(a.SALES_NUM4, '') SalesNo, 
        count(CUS_ID) NumOfCust, 
        count(distinct sales_num) NumOfRep,
        count(ORD_NUM) MTD_Ord, 
        convert(decimal(10, 2), sum(ORD_AMT)) MTD_Amt
from 
    (select SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
     from   customer
     union
     select SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
     from   omsdata7.dbo.customer) as a
    inner join
    (select SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
     from   orders
     union
     select SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
     from   omsdata7.dbo.orders) as b
    on a.SALES_NUM4 = b.SALES_NUM4
where   a.SALES_NUM4 != '' and SLS_TYPE = '1' 
        and DATEADD(day, ORD_DT-4, '1801-01-01') >= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
        and DATEADD(day, ORD_DT-4, '1801-01-01') < getdate()
group by    a.SALES_NUM4
order by   a.SALES_NUM4

【讨论】:

  • 它给了我“列 'a.SALES_NUM4' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。”但我自己也使用子查询解决了这个问题。非常感谢。
  • 我现在添加了group by子句。
  • 如果这对您有帮助,请接受并投票。
【解决方案2】:
    -- QUERY 1 #tmpReport1 with respect the grouping and sort order    

        select
            isnull(SALES_NUM4, '') SalesNo, 
            count(CUS_ID) NumOfCust, 
            count(distinct sales_num) NumOfRep
        into #tmpReport1
        from 
            (select 
                 SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
             from customer

             union

             select 
                 SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM 
             from omsdata7.dbo.customer) a
        where 
            SALES_NUM4 != '' and SLS_TYPE = '1'
        group by 
            SALES_NUM4
        order by 
            SALES_NUM4

    -- QUERY 2 BUILD #tmpReport2 with respect the grouping and sort order
    select 
        isnull(SALES_NUM4, '') SalesNo, 
        count(ORD_NUM) MTD_Ord, 
        convert(decimal(10, 2), sum(ORD_AMT)) MTD_Amt
    into #tmpReport2
    from 
        (select 
             SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
         from orders

         union

         select 
             SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT 
         from omsdata7.dbo.orders) a
    where 
        DATEADD(day, ORD_DT-4, '1801-01-01') >= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
        and DATEADD(day, ORD_DT-4, '1801-01-01') < getdate()
        and SALES_NUM4 != ''
    group by 
        SALES_NUM4
    order by 
        SALES_NUM4

-- combine both tables in here
select * from #tmpReport1
union all
select * from #tmpReport2

-- drop temps
drop table #tmpReport1
drop table #tmpReport2

希望我正确理解了您的问题?

编辑:水平加入,然后与上面相同的脚本,除了

-- combine both tables in here
select * from #tmpReport1
union all
select * from #tmpReport2

改成

-- combine both tables horizontally here
select 
   tmp1.*
   ,tmp2.* 
from #tmpReport1 tmp1
full join #tmpReport2 tmp2
ON
   tmp1.SalesNo = tmp2.SalesNo

并根据您的规范简单地识别您的列。

【讨论】:

  • SQL 向我抛出“关键字 'UNION' 附近的语法不正确。”
  • 我的错,union all 在一个函数之后不起作用,所以我在 union 之前先把它变成了一个表。
  • 只返回第一个表,但仍然缺少“count(ORD_NUM) MTD_Ord”和“convert(decimal(10,2), sum(ORD_AMT)) MTD_Amt”
  • 这几乎奏效了,除了它从第一个大查询返回第一行和第二行的 John 15、James 13 和第二个查询的第三行和第四行的 John 3、James 7。
  • 这是我的错,我没有指定我想水平加入为“加入”
【解决方案3】:
select isnull(SALES_NUM4,'') SalesNo, count(CUS_ID) NumOfCust, count(distinct SALES_NUM) NumOfReps, MAX(b.MTD_Ord) MTD_Ord, MAX(b.MTD_Amt) MTD_Amt
from (
select SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM from customer
union
select SALES_NUM4, CUS_ID, SLS_TYPE, SALES_NUM from omsdata7.dbo.customer
where SLS_TYPE = '1'
) a
Left join 
(select isnull(SALES_NUM4,'') SalesNo, count(ORD_NUM) MTD_Ord, sum(ORD_AMT) MTD_Amt
from (
select SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT from orders
union
select SALES_NUM4, ORD_DT, ORD_NUM, ORD_AMT from omsdata7.dbo.orders
) b1
where DATEADD(day, ORD_DT-4, '1801-01-01') >= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
and DATEADD(day, ORD_DT-4, '1801-01-01') < getdate() 
group by SALES_NUM4 
) b on a.SALES_NUM4 = b.SalesNo 
where SALES_NUM4 != ''
group by SALES_NUM4
order by SALES_NUM4

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多