如何在sql server中实现此查询?

时间:2016-09-19 11:58:42

标签: sql-server

我是sql server的初学者,有两张桌子,表GetOnlineBills有这种形状:

--Telno--      --Cycle--      --Bill--
nchar(20)       nchar(20)       float


25Percantage

--Telno--      --Cycle--      --Bill--
nchar(20)       nchar(20)       float


想要使用此流程在tsql表中为分析Telno编写查询或GetOnlineBill

1-fetch Telno ang get it bill value in Cycle 951 and Cycle 952
2-If Bill(952)>Bill(951) then write into 25 percantage this data (Bill(952)-Bill(951))


进入GetOnlineBill的表每个周期写入订阅账单信息,例如有两个订阅(在真正的世界有100万订阅)与此计划:
进入GetOnlineBills一个mounth数据是这样的:

    --Telno--      --Cycle--      --Bill--
      12345           951           300
      54321           951           500


和其他月份数据是:

--Telno--      --Cycle--      --Bill--
  12345            952            400
  54321            952            600


两个mounth的最终GetOnlineBill是:

    --Telno--       --Cycle--      --Bill--
      12345            951            300
      54321            951            500
      12345            952            400
      54321            952            600


现在,我想要分析GetOnlineBill,想要写入查询或tsql创建最终25Percantage表格给我看这个:

--Telno--      --Cycle--      --Bill--
  12345          951-952         100 ------>Bill(952)-Bill(951) Minus
  54321          951-952         300

  ----------------------------------------

  Explain:
  Bill:Field Name on GetOnlineBill table
  952:Cycle
  951:Cycle


我如何为此目的编写查询或tsql?请写信给我。谢谢所有。

2 个答案:

答案 0 :(得分:0)

尝试如下:

DECLARE @Tbl TABLE (TelNo NCHAR(20), Cycle NCHAR(20), Bill FLOAT)
INSERT INTO @Tbl
VALUES  
('12345', '951', 300),
('12345', '952', 400),
('54321', '951', 500),
('54321', '952', 600)

;WITH CTE
AS
(
    SELECT *, DENSE_RANK() OVER (ORDER BY Cycle) MonthId  
    FROM @Tbl
)

SELECT 
    CurrentMonth.TelNo,
    CurrentMonth.Cycle + '-' + NextMonth.Cycle Cycle,
    CASE 
        WHEN NextMonth.Bill > CurrentMonth.Bill THEN NextMonth.Bill - CurrentMonth.Bill
        ELSE CurrentMonth.Bill END Bill -- Change as you want
FROM 
    CTE CurrentMonth LEFT JOIN 
    CTE NextMonth ON CurrentMonth.TelNo = NextMonth.TelNo AND (NextMonth.MonthId - 1) = CurrentMonth.MonthId
WHERE
    NextMonth.MonthId IS NOT NULL

结果:

TelNo                Cycle                    Bill
-------------------- ------------------------ ---------
54321                951-952                  100
12345                951-952                  100

答案 1 :(得分:0)

内部联接可以帮助您:

SELECT  y.Telno,
        t.Cycle+'-'+y.Cycle Cycle,
        y.Bill - t.Bill Price
FROM YourTable y
INNER JOIN YourTable t
    ON y.Telno = t.TelNo AND CAST(y.Cycle as int)-1 = CAST(t.Cycle as int)

输出:

Telno   Cycle   Price
12345   951-952 100
54321   951-952 100

如果Cycle列无法转换为integer,那么您需要一些其他字段才能正确排序表并加入该字段(或外部应用)