1

私は以下のようなテーブルを持っています

 Board Component Cost

    b1     c1       5
    b1     c2       10
    b2     c3       15
    b3     c4       20
    b3     c5       25
    b4     C6       25
  ---------------------
                  100%

テーブルから値を取得するための入力を与える必要があります。たとえば...

入力が 20% の場合

出力は

 Board Component Cost

    b1      c1      5
    b1      c2     10
    b2      c3     15

入力が 50% の場合

出力は

 Board Component Cost

    b1      c1      5
    b1      c2     10
    b2      c3     15
    b3      c4     20

等々

SQLサーバーでクエリを書く方法

4

5 に答える 5

1
DECLARE @T TABLE (Col1 VARCHAR(10), Col2 VARCHAR(10), Col3 INT, SumValue Int)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b1','c1',5)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b1','c2',10)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b2','c3',15)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b3','c4',20)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b3','c5',25)

INSERT INTO @T(Col1, Col2, Col3)
VALUES ('b4','C6',25) 

DECLARE @SumValue INT

UPDATE @T
SET @SumValue=SumValue = ISNULL(@SumValue,0)+ Col3
FROM @T T

SELECT *
FROM @T
WHERE SumValue <= (
    SELECT TOP 1 SumValue
    FROM @T AS T
    WHERE T.SumValue>=40
    ORDER BY SumValue)
于 2012-05-22T11:21:07.930 に答える
1

まず、以前の値をグループ化して合計する必要があるため、これを実装するには Identity が必要です。思いつくことができることを願っています。あなたの状況をシミュレートするために、この表を作成しました。

create table mySUM(
id int identity(1,1),
id2 varchar(50),
cost int)

insert into mySUM values
('c1',  5),   ('b1', 10),    ('b2',15),    ('b3',20),    ('b3',25),    ('b4',25)

私はあなたに2つの選択があります。これが主なものですが、グループ化して合計しているため、最後の列で合計が得られます。

select a.Id, a.id2, sum(b.cost) as totalCost
from mySUM a cross join mySUM b
where b.Id <= a.Id
group by a.Id,a.id2
having sum(b.cost)<=50
order by  a.Id

結果:

1   c1  5
2   b1  15
3   b2  30
4   b3  50

それを望まない場合は、上記の選択の ID に基づいてメイン テーブルで選択を実行できます。

select * from mySUM where id in(
    select a.Id
    from mySUM a cross join mySUM b
    where b.Id <= a.Id
    group by a.Id,a.id2
    having sum(b.cost)<=50
)

結果:

1   c1  5
2   b1  10
3   b2  15
4   b3  20
于 2012-05-22T09:14:35.463 に答える
0

これを試してみてください

SELECT  t.* ,
        rt.runningTotal
FROM    Test t
        CROSS APPLY ( SELECT    SUM(cost) AS runningTotal
                      FROM      Test
                      WHERE     Board <= t.Board
                                AND Component <= t.Component
                    ) AS rt
WHERE   runningTotal <= 50
ORDER BY t.Board
于 2012-05-22T09:22:01.580 に答える
0

これを試して:

with CTE (Board, Component ,Cost, rownum)
as
(
SELECT Board,Component, Cost,
ROW_NUMBER() OVER(order by Cost asc, Board asc, Component asc) rownum
  FROM yourTable t0
  where Cost > 0
)
select
t1.Board,t1.Component, t1.Cost, t1.rownum, sum(t2.Cost)
from 
CTE t1 join CTE t2 on t1.rownum >= t2.rownum
group by t1.Board,t1.Component, t1. Cost, t1.rownum
having sum(t2.Cost) < 50
order by t1.rownum;

動作するはずです

于 2012-05-22T10:12:25.920 に答える
0
create table #per(
Board varchar(10),
Component varchar(max),
Cost int)

create proc out_per (
@desire_per int)
as begin

declare @sum int, @count int;
declare @board varchar(max), @component varchar(max);
declare @cost int;
declare per_cursor cursor for
select Board,Component,Cost from per
open per_cursor
fetch next from per_cursor into @Board, @component, @cost
while(@@fetch_status=0)
    begin
        insert into #per values (@Board, @component, @cost);
        set @sum=(select sum(cost) from #per)
        if(@sum>=@desire_per)
        begin
            break;
        end
        fetch next from per_cursor into @Board, @component, @cost
    end
    close per_cursor
    deallocate per_cursor
    select * from #per
    truncate table #per
end

exec out_per @desire_per=30
于 2012-05-22T12:45:51.250 に答える