Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中的投影/复制?_Sql_Tsql - Fatal编程技术网

SQL查询中的投影/复制?

SQL查询中的投影/复制?,sql,tsql,Sql,Tsql,我的SQL有点生疏-是否有一种SQL方法可以投影如下所示的输入表: Name SlotValue Slots ---- --------- ----- ABC 3 1 ABC 4 2 ABC 6

我的SQL有点生疏-是否有一种SQL方法可以投影如下所示的输入表:

Name                SlotValue              Slots
----                ---------              -----
ABC                 3                      1
ABC                 4                      2
ABC                 6                      5
Name                SlotSum                 Slot
----                -------                 ----
ABC                 13                      1
ABC                 10                      2
ABC                 6                       3
ABC                 6                       4
ABC                 6                       5
进入如下所示的“投影”结果表:

Name                SlotValue              Slots
----                ---------              -----
ABC                 3                      1
ABC                 4                      2
ABC                 6                      5
Name                SlotSum                 Slot
----                -------                 ----
ABC                 13                      1
ABC                 10                      2
ABC                 6                       3
ABC                 6                       4
ABC                 6                       5
换句话说,结果集应该包含相当于MAXSlots的行数,枚举的Slot从1到MAXSlots,每个“Slot”的总和应该反映投影到“slots”位置的slotvalue的总和。对于病理病例:

Name               SlotValue                Slots
----               ---------                -----
ABC                4                        3
我们应该得到:

Name               SlotSum                  Slot
----               -------                  ----
ABC                4                        1
ABC                4                        2
ABC                4                        3
求和逻辑非常简单-将每个SlotValue投影到插槽数:

SlotValue         SlotValue        SlotValue       Slot             Sum
---------         ---------        ---------       ----             ---
3                 4                6               1                13 (3+4+6)
0                 4                6               2                10 (0+4+6)
0                 0                6               3                6 (0+0+6)
0                 0                6               4                6 (0+0+6)
0                 0                6               5                6 (0+0+6)

更新:最后,我在一个存储过程中使用了LOCALGHOST方法的变体。我希望有一种不用循环的方法来实现这一点。

我不确定您能否在视图中实现这一点。你必须使用一个程序。 您也可以在过程中将ProjectedTable设置为临时/变量表。我真的很想看看你是如何把它放到一个视图中的,因为你需要动态地生成一系列的数字

declare @maxSlot int 
set @maxSlot = select max(slots) from SlotTable

truncate ProjectedTable
while @i > 0 
    begin
    insert into ProjectedTable (
          SlotSum
          ,Slot
    ) values (
          (select sum(slotValue) from SlotTable where slots >= @maxSlot)
         ,@maxSlot
    )
    set @maxSlot = @maxSlot - 1 
end
select SlotSum, Slot from ProjectedTable

给你。在其当前形式下,最多可使用100个插槽。你可以运用你的想象力来容纳更多的人

DECLARE @SLOT TABLE
    (
    SlotName varchar(25) NOT NULL,
    SlotValue int NOT NULL,
    Slot int NOT NULL
    )

INSERT INTO @SLOT (SlotName, SlotValue, Slot)
    SELECT 'ABC', 3, 1
    UNION
    SELECT 'ABC', 4, 2
    UNION
    SELECT 'ABC', 6, 5

SELECT
    CASE
        WHEN SLOT.SlotName IS NOT NULL THEN SLOT.SlotName
        ELSE 
            COALESCE(
            (SELECT TOP 1 SL.SlotName FROM @SLOT AS SL WHERE SL.Slot < SLOT_PROJECT.Slot ORDER BY SL.Slot DESC),
            (SELECT TOP 1 SL.SlotName FROM @SLOT AS SL WHERE SL.Slot > SLOT_PROJECT.Slot ORDER BY SL.Slot ASC)
            )
    END AS SlotName,
    (
    SELECT
        SUM(SLOT10.SlotValue)
    FROM
        @SLOT AS SLOT10
    WHERE
        SLOT10.Slot >= SLOT_PROJECT.Slot
    ) AS SlotSum,
    SLOT_PROJECT.Slot
FROM
    (
    SELECT
        (TENS.Seq + ONES.Seq) AS Slot
    FROM
        (
        SELECT 1 AS Seq
        UNION ALL
        SELECT 2
        UNION ALL
        SELECT 3
        UNION ALL
        SELECT 4
        UNION ALL
        SELECT 5
        UNION ALL
        SELECT 6
        UNION ALL 
        SELECT 7
        UNION ALL
        SELECT 8
        UNION ALL
        SELECT 9
        ) AS ONES
        CROSS JOIN
        (
        SELECT 0 AS Seq
        UNION ALL
        SELECT 10
        UNION ALL
        SELECT 20
        UNION ALL
        SELECT 30
        UNION ALL
        SELECT 40
        UNION ALL
        SELECT 50
        UNION ALL
        SELECT 60
        UNION ALL 
        SELECT 70
        UNION ALL
        SELECT 80
        UNION ALL
        SELECT 90
        ) AS TENS
    WHERE
        (TENS.Seq + ONES.Seq) <= (SELECT MAX(Slot) FROM @SLOT)
    ) AS SLOT_PROJECT
    LEFT JOIN @SLOT AS SLOT ON
        SLOT.Slot = SLOT_PROJECT.Slot

啊,我还是不明白,你说的“项目”是什么意思?有一种方法可以不用循环,但你选择忽略它。为什么?因为它会融化那些不得不处理它的维护人员的大脑。我被否决了,但我不明白为什么,除非有人在没有变量的情况下这么做;p表格变量仅用于演示目的。它也可能是一个普通的表,我们只使用WHERE子句。ehh,我不知道交叉连接10s和1s是什么,我使用了它的一个变体。我想你的循环变量应该是@maxSlot而不是@I though.LOCALGHOST:I不知道?这是什么样的批评?不要因为你以前从未见过使用过一种战术,就批评它。你的是程序性的。我的是基于背景的。这对某些人很重要,在某些平台上,这是唯一的机会。