任何人都可以幫助我如何在 SQL 上編碼:我有這個臨時表:
表X:
ID Code1 Code2 Sold Money1 Money2 ISCode
1 GB GB 10 100.000000 1
1 2GB 2GB 5 150.000000 1
1 AB NULL 1 150.000000 0
1 CB BK 1 150.000000 0
1 NULL DE NULL 150.000000 1
我需要計算 Money2 列的每一行。邏輯是這樣的:
- 檢查行 ISCode= 1
- 通過以下公式計算每行的 Money2:Money1/Sold
然后我需要在臨時表的行尾插入這個新行:TableX
ID Code1 Code2 Sold Money1 Money2 ISCode
1 total total 15 400.000000 16.670000 1
的邏輯
新列的已售出添加 ISCode = 1 行中的所有已售出
MONEY1新列是添加所有MONEY1的行,其中ISCode = 1
Money2新列是MONEY1 /出售。但在已售列中有一行具有空值,因此在 Money2 的計算中將排除該行。
sold = 10 5 = 15 money1 = 310.000000 money2 = 400.00000/15 -- Row #3 will be excluded in the computation of money2 ID Code1 Code2 Sold Money1 Money2 ISCode 1 GB GB 10 100.000000 10.000000 1 1 2GB 2GB 5 150.000000 30.000000 1 1 NULL DE NULL 150.000000 NULL 1 1 total total 15 400.000000 16.670000 1
這是否可以使用臨時表,還是在上面的這種情況下使用表值引數表更好?
示例 DML 和 DDL
CREATE TABLE #tableX(
[ID] [int] NULL,
[Code1] [varchar](4) NULL,
[Code2] [varchar](6) NULL,
[Sold] [int] NULL,
[Money1] [money] NULL,
[Money2] [money] NULL
)
INSERT INTO #tableX(
[ID],
[Code1],
[Code2],
[Sold],
[Money1],
[Money2]
)VALUES(
1,
'GB',
'GB',
10,
100.000000,
NULL
),
(
1,
'2GB',
'2GB',
5,
150.000000,
NULL
),
(
1,
'AB',
NULL,
0
150.000000,
NULL
),
(
1,
'CB',
'BK',
1
150.000000,
NULL
),
(
1,
NULL,
'DE',
NULL
150.000000,
NULL
)
uj5u.com熱心網友回復:
好的,按照之前的一些評論,檢查這是否是您的意思。
您有這張表(即臨時表)
DECLARE @tableX AS TABLE(
[ID] [int] NULL,
[Code1] [varchar](4) NULL,
[Code2] [varchar](6) NULL,
[Sold] [int] NULL,
[Money1] [money] NULL,
[Money2] [money] NULL,
[IsCode] [bit] NULL
)
請注意,我添加了“IsCode”列 - 在您的問題的開頭它存在,但在創建表中沒有 - 所以我假設在那里。
您所做的插入陳述句可以更改為:
INSERT INTO @tableX([ID],[Code1],[Code2],[Sold],[Money1],[Money2],[IsCode])
SELECT
pack1.ID,
pack1.Code1,
pack1.Code2,
pack1.Sold,
pack1.Money1,
(CASE WHEN pack1.IsCode = 1 THEN pack1.Money1/pack1.Sold ELSE NULL END),
pack1.IsCode
FROM
(SELECT 1 AS [ID],'GB' AS [Code1],'GB' AS [Code2],10 AS [Sold],100.000000 AS [Money1],1 AS [IsCode]
UNION ALL
SELECT 1,'2GB','2GB',5,150.000000,1
UNION ALL
SELECT 1,'AB',NULL,0,150.000000,0
UNION ALL
SELECT 1,'CB','BK',1,150.000000,0
UNION ALL
SELECT 1,NULL,'DE',NULL,150.000000,1) AS pack1
SELECT * FROM @tableX WHERE IsCode=1
UNION ALL
SELECT 1,'total','total',SUM(Sold),SUM(Money1),(SUM(Money1)/SUM(Sold)),1 FROM @tableX WHERE IsCode=1
或者,您可以按原樣放置插入物,然后UPDATE在 Money2 列上運行 a 。然后繼續進行最后的選擇,呼叫所有資料和最后的“總計”行。
uj5u.com熱心網友回復:
1- 為了用值填充 Money2 列:
update #tableX set Money2 =
case isnull(Sold,0) when 0 then Null else CONVERT(DECIMAL(10,2),Money1/Sold) end where iscode = 1
請注意,我已將 Money1/Sold 比率四舍五入到小數點后第二位。
2- 為了在表中插入匯總行,我會考慮很多情況。
a- 您想計算每個 ID 的摘要(在您的情況下 ID = 1 僅存在,但如果您有很多 ID)
insert into #tableX
select ID , 'ttl','ttl',sum(Sold) Sold,Sum(isnull(Money1,0)) Money1 ,
case isnull(Sum(Sold),0) when 0 then Null else CONVERT(DECIMAL(10,2),Sum(Money1)/Sum(Sold)) end Money2,0 as iscode
from #tableX
where iscode = 1 and isnull(sold,0) <> 0
Group by ID
在這種情況下,每個 ID 將有多個摘要行。
b- ID 無關緊要,整個資料集只需要一行
insert into #tableX
select 99999999 , 'ttl','ttl',sum(Sold) Sold,Sum(isnull(Money1,0)) Money1 ,
case isnull(Sum(Sold),0) when 0 then Null else CONVERT(DECIMAL(10,2),Sum(Money1)/Sum(Sold)) end Money2,0 as iscode
from #tableX
where iscode = 1 and isnull(sold,0) <> 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/350420.html
標籤:sql sql-server 查询语句
