在SQL中使用几行Detail

时间:2015-10-28 15:47:14

标签: sql sql-server

我遇到了这个问题 我有这张表

private boolean resetPointValue = false;

    // initializes rollClicked method when ROLL button is clicked
    public void rollClicked(View v) {

        int dice1, dice2;

        betInt = Integer.valueOf(bettingSpinner.getSelectedItem().toString());
        Random rand1 = new Random();
        Random rand2 = new Random();
        dice1 = rand1.nextInt(6) + 1;
        dice2 = rand2.nextInt(6) + 1;

        // sets values for dice images
        if(dice1 == 1) {
            dice1Image.setImageResource(R.drawable.die1);
            d1 = 1;
        }
        else if(dice1 == 2) {
            dice1Image.setImageResource(R.drawable.die2);
            d1 = 2;
        }
        else if(dice1 == 3) {
            dice1Image.setImageResource(R.drawable.die3);
            d1 = 3;
        }
        else if(dice1 == 4) {
            dice1Image.setImageResource(R.drawable.die4);
            d1 = 4;
        }
        else if(dice1 == 5) {
            dice1Image.setImageResource(R.drawable.die5);
            d1 = 5;
        }
        else if(dice1 == 6) {
            dice1Image.setImageResource(R.drawable.die6);
            d1 = 6;
        }

        if(dice2 == 1) {
            dice2Image.setImageResource(R.drawable.die1);
            d2 = 1;
        }
        else if(dice2 == 2) {
            dice2Image.setImageResource(R.drawable.die2);
            d2 = 2;
        }
        else if(dice2 == 3) {
            dice2Image.setImageResource(R.drawable.die3);
            d2 = 3;
        }
        else if(dice2 == 4) {
            dice2Image.setImageResource(R.drawable.die4);
            d2 = 4;
        }
        else if(dice2 == 5) {
            dice2Image.setImageResource(R.drawable.die5);
            d2 = 5;
        }
        else if(dice2 == 6) {
            dice2Image.setImageResource(R.drawable.die6);
            d2 = 6;
        }

        // calculate sum of dice for each roll
        if (rounds >= 0)
        {
            rollTotal = sum(dice1, dice2);
            roll.setText(String.valueOf(rollTotal));
        }
        else {
            point.setText(String.valueOf(pointValue));
        }

        // win on first roll
        if((dice1 + dice2 == winNumber1 || (sum(dice1, dice2) == winNumber2)) && rounds == 0) {
            winsCounter++;
            bankRollInt = bankRollInt + betInt;
            bankRollText.setText(String.valueOf(bankRollInt));
            // display win result
            results.setVisibility(View.VISIBLE);
            resetPointValue = true;
        }
        // lose on first roll
        else if(rounds == 0 && (sum(dice1, dice2) == loseNumber1 || sum(dice1, dice2) == loseNumber2 || sum(dice1, dice2) == loseNumber3)){
            loseCounter++;
            bankRollInt = bankRollInt - betInt;
            bankRollText.setText(String.valueOf(bankRollInt));
            results.setVisibility(View.VISIBLE);
            results.setText("House wins! You Lose.");
            resetPointValue = true;
        }
        // display round results if no win or lose on first roll
        else if(rounds == 0) {
            pointValue = sum(dice1, dice2);
            results.setVisibility(View.VISIBLE);
            point.setText(String.valueOf(pointValue));
            bankRollText.setText(String.valueOf(bankRollInt));
            results.setText("Point established. It is " + pointValue + ". Roll Again.");
            resetPointValue = false;
        }

        // lose if player hits 7 after first roll
        if(rounds > 0 && (sum(dice1, dice2) == 7)) {
            loseCounter++;
            bankRollInt = bankRollInt - betInt;
            bankRollText.setText(String.valueOf(bankRollInt));
            results.setVisibility(View.VISIBLE);
            results.setText("House wins! You Lose.");
            resetPointValue = true;
        }
        // player wins if roll = pointValue after first roll
        else if(rounds > 0 && (sum(dice1, dice2) == pointValue)) {
            winsCounter++;
            bankRollInt = bankRollInt + betInt;
            bankRollText.setText(String.valueOf(bankRollInt));
            // display win result
            results.setVisibility(View.VISIBLE);
            resetPointValue = true;
        }
        // display round results if no win or lose after first roll
        else if(rounds > 0 && (sum(dice1, dice2) != pointValue && sum(dice1, dice2) != 7)){
            results.setVisibility(View.VISIBLE);
            bankRollText.setText(String.valueOf(bankRollInt));
            results.setText("No one wins. Keep rolling Dice.");
        }

        if(resetPointValue == true) {
            rounds = 0;
            pointValue = 0;
        }
        else {
            rounds++;
        }
    } // end rollClicked method

    // calculate sum of dice
    public int sum(int num1, int num2) {
        return num1 + num2;
    } // end sum method

所以我想要的是案例1订单1将从案例2订单1减去金额,然后从案例2订单1减去案例3订单1,然后案例1订单2减去案例2订单2,然后减去案例3订单2等 就像一个连锁反应

公式(案例1订单1-案例2订单1) - 案例3订单1

结果必须像这样

Case     Order          Amount
1         1               50
1         2               20
1         3               25 
2         1               35
2         2               40
2         3               38
3         1               45
3         2               50
3         3               25

3 个答案:

答案 0 :(得分:0)

您需要一个相关的子查询,您可以在其中添加金额。你可以看到公式很简单:

select 
  mycase, 
  myorder, 
  (
    select sum(case when mycase = 1 then amount else -amount end)
    from mytable other
    where other.myorder = mytable.myorder
    and other.mycase <= mytable.mycase
  ) as amount
from mytable
order by mycase, myorder;

我将列命名为mycasemyorder,因为caseorder都是SQL中的保留字。当然,您可以将这些名称与引号("order""case")一起使用,但我不想引用列名。

答案 1 :(得分:0)

Thorsten的解决方案可能使用了正确的逻辑,它只是在SUM中使用了错误的列名:

select 
  mycase, 
  myorder, 
  (
    select sum(case when mycase = 1 then amount else -amount end)
    from mytable other
    where other.myorder = mytable.myorder
    and other.mycase <= mytable.mycase
  ) as amount
from mytable
order by mycase, myorder;

您的SQL Server发布了什么? 如果它支持累积和,那么它很简单:

select t.*,
   sum(case when mycase = 1 then Amount else -Amount end) 
   over (partition by myorder 
         order by mycase
         rows unbounded preceding)
from tab as t

答案 2 :(得分:0)

感谢所有人,我想出了我在这里找到的这个公式:

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER ORDER BY (num1) AS rn
        FROM    mytable
        )
SELECT  qc.*, qc.num1 - qp.num2
FROM    q qc
LEFT JOIN
        q qp
ON      qp.rn = qc.rn - 1