Sql server SQL Server 2008:TSQL,根据列值为不同时间选择相同的数据
我使用的是mssql 2008 R2 我有以下结构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
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,我可以问你在我的回答中不喜欢什么吗?没有什么我不喜欢的:),有什么,你问吗?