Sql server SQL Server 2008:TSQL,根据列值为不同时间选择相同的数据

Sql server SQL Server 2008:TSQL,根据列值为不同时间选择相同的数据,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我使用的是mssql 2008 R2 我有以下结构 create table #temp ( product int, [order] int, ord_qnty int ) insert #temp select 10 ,3,4 现在,如果ord_qnty是4,我想选择相同的产品,订购四次,但在所有四行中ord_qnty的值应该是1,即 应该被淘汰 Product order ord_qnty 10 3

我使用的是mssql 2008 R2

我有以下结构

    create table #temp (
    product int,
    [order] int,
    ord_qnty int
    )

    insert #temp 
    select 10 ,3,4
现在,如果ord_qnty是4,我想选择相同的产品,订购四次,但在所有四行中ord_qnty的值应该是1,即

应该被淘汰

    Product order ord_qnty
    10      3     1
    10      3     1
    10      3     1
    10      3     1

如果你有一个数字表,你可以使用它。如果没有,您可以生成一个:

;with Numbers(n) as (
    select ROW_NUMBER() OVER (ORDER BY object_id) from sys.objects
)
select product,[order],1 as ord_qnty
from #temp t inner join Numbers num
    on t.ord_qnty >= num.n

(在我几乎为空的scratch数据库中,
ROW_NUMBER()
生成77行。如果这还不够,您可以引入交叉连接或使用其他技巧生成更多数字,或者您可以创建并填充一个永久数字表)

如果您有一个数字表,您可以使用它。如果没有,您可以生成一个:

;with Numbers(n) as (
    select ROW_NUMBER() OVER (ORDER BY object_id) from sys.objects
)
select product,[order],1 as ord_qnty
from #temp t inner join Numbers num
    on t.ord_qnty >= num.n
(在我几乎为空的scratch数据库中,
行数()生成77行。如果这还不够,您可以引入交叉连接或使用其他技巧生成更多的数字,或者您可以创建并填充一个永久数字表)

试试这个-

查询:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
输出:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
查询成本:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2

对于任何“百万价值”:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
设置不计数;
声明@numbers表(number INT)
声明@temp表
(
积整数
,[order]INT
,ord_qnty INT
)
插入@temp(产品,[订单],订单)
选择10、3、4
声明
@i BIGINT=1
,@max BIGINT=(
选择最大值(ord_qnty)
来自@temp
)
而(@i试试这个-

查询:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
输出:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
查询成本:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2

对于任何“百万价值”:

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN [master].dbo.spt_values sv ON t.ord_qnty > sv.number
WHERE sv.[type] = 'p'

SELECT  
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
JOIN (
    SELECT number = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.system_parameters p    
) sv ON t.ord_qnty >= sv.number
product     order       ord_qnty
----------- ----------- -----------
10          3           1
10          3           1
10          3           1
10          3           1
SET NOCOUNT ON;

DECLARE @numbers TABLE (number INT)

DECLARE @temp TABLE 
(
      product INT
    , [order] INT
    , ord_qnty INT
)
INSERT @temp(product, [order], ord_qnty) 
SELECT 10, 3, 4

DECLARE 
      @i BIGINT = 1
    , @max BIGINT = (
            SELECT MAX(ord_qnty)
            FROM @temp 
        )

WHILE (@i <= @max) BEGIN

    INSERT INTO @numbers (number) 
    VALUES (@i), (@i+1), (@i+2), (@i+3), (@i+4), (@i+5), (@i+6), (@i+7), (@i+8), (@i+9)
    SELECT @i += 10

END

SELECT 
      t.product
    , t.[order]
    , ord_qnty = 1 
FROM @temp t
CROSS JOIN (
    SELECT * 
    FROM @numbers
    WHERE number < @max + 1
) t2
设置不计数;
声明@numbers表(number INT)
声明@temp表
(
积整数
,[order]INT
,ord_qnty INT
)
插入@temp(产品,[订单],订单)
选择10、3、4
声明
@i BIGINT=1
,@max BIGINT=(
选择最大值(ord_qnty)
来自@temp
)

而(@i@Nishad,我可以问你在我的回答中不喜欢什么吗?没有什么我不喜欢的:),有什么吗,你问吗?@Nishad,我可以问你在我的回答中不喜欢什么吗?没有什么我不喜欢的:),有什么,你问吗?