选择基于列

时间:2016-02-23 15:46:47

标签: sql sql-server tsql select

我有一个Power表来存储建筑电路的细节。电路可以是1相或3相,但在电路表中始终表示为1行。

我想将电路的细节插入到连接表中,该连接表将面板连接到电路 我目前的电路表有以下细节

CircuitID | Voltage | Phase | PanelID | Cct | 
    1     |   120   |   1   |    1    |   1 |
    2     |   208   |   3   |    1    |   3 |
    3     |   208   |   2   |    1    |   8 |

是否有可能创建一个select,当它看到3相行时,它选择3行(或2个选择2行)并每次将Cct列递增1或者是否必须创建循环?

CircuitID | PanelID | Cct | 
    1     |    1    |   1 |
    2     |    1    |   3 |
    2     |    1    |   4 |
    2     |    1    |   5 |
    3     |    1    |   8 |
    3     |    1    |   9 |

3 个答案:

答案 0 :(得分:2)

这是一种方法

首先使用计数表(最佳方式)生成数字。这是一篇关于无循环生成数字的优秀文章。 Generate a set or sequence without loops

然后使用yourtable加入数字表,其中每条记录的phase值应大于数字表中的序号

;WITH e1(n) AS
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
), -- 10
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10
e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2), -- 10*100
numbers as ( SELECT n = ROW_NUMBER() OVER (ORDER BY n) FROM e3 )
SELECT CircuitID,
        PanelID,
        Cct = Cct + ( n - 1 )
FROM   Yourtable a
        JOIN numbers b
            ON a.Phase >= b.n 

答案 1 :(得分:0)

您可以使用一个递归cte。

执行此操作
WITH cte AS
(
    SELECT [CircuitID], [Voltage], [Phase], [PanelID], [Cct], [Cct] AS [Ref]  
    FROM [Power]
    UNION ALL
    SELECT [CircuitID], [Voltage], [Phase], [PanelID], [Cct] + 1, [Ref]  
    FROM cte 
    WHERE [Cct] + 1 < [Phase]  + [Ref] 
)
SELECT [CircuitID], [PanelID], [Cct] 
FROM cte
ORDER BY [CircuitID]

答案 2 :(得分:0)

最简单的方法,

Select y.* from (
Select 1 CircuitID,120 Voltage,1 Phase,1 PanelID, 1 Cct
union
Select 2,208,3,1,3
union
Select 3,208,2,1,8)y, 
(Select 1 x
union 
Select 2 x
union 
Select 3 x)x
Where x.x <= y.Phase

直接复制粘贴,尝试,它将100%运行。在那之后,只需替换我的&#39; y&#39;用你真实的桌子。