Sql server 如何在存储过程中合并值?
我有一张这样的桌子:Sql server 如何在存储过程中合并值?,sql-server,tsql,stored-procedures,group-by,Sql Server,Tsql,Stored Procedures,Group By,我有一张这样的桌子: Entry ID | Name | qty 12 | Global | 5 12 | In Europe | 15 12 | In Asia | 21 12 | In US | 53 18 | Max | 5 18 | In Europe | 35 1
Entry ID | Name | qty
12 | Global | 5
12 | In Europe | 15
12 | In Asia | 21
12 | In US | 53
18 | Max | 5
18 | In Europe | 35
18 | In Asia | 63
18 | In US | 85
我想创建一个存储过程,在其中放置一个参数“Entry ID”,exec give number@ent=12给出:
Entry ID | In Europe | In Asia | In US | Global
12 | 15 | 21 | 53 | 5
你能帮我一下吗?试试这个-
查询:
DECLARE @temp TABLE
(
EntryID INT
, Name NVARCHAR(50)
, Qty INT
)
INSERT INTO @temp (EntryID, Name, qty)
VALUES
(12, 'Global' , 5),
(12, 'In Europe' , 15),
(12, 'In Asia' , 21),
(12, 'In US' , 53),
(18, 'Max' , 5),
(18, 'In Europe' , 35),
(18, 'In Asia' , 63),
(18, 'In US' , 85)
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM @temp
GROUP BY EntryID
EntryID In Europe In Asia In US Global
----------- ----------- ----------- ----------- -----------
12 15 21 53 5
18 35 63 85 0
CREATE PROCEDURE dbo.usp_GetEntryID
@EntryID INT
AS BEGIN
SET NOCOUNT ON;
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM dbo.table1 --<-- your table
WHERE EntryID = @EntryID
GROUP BY EntryID
RETURN 0
END
输出:
DECLARE @temp TABLE
(
EntryID INT
, Name NVARCHAR(50)
, Qty INT
)
INSERT INTO @temp (EntryID, Name, qty)
VALUES
(12, 'Global' , 5),
(12, 'In Europe' , 15),
(12, 'In Asia' , 21),
(12, 'In US' , 53),
(18, 'Max' , 5),
(18, 'In Europe' , 35),
(18, 'In Asia' , 63),
(18, 'In US' , 85)
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM @temp
GROUP BY EntryID
EntryID In Europe In Asia In US Global
----------- ----------- ----------- ----------- -----------
12 15 21 53 5
18 35 63 85 0
CREATE PROCEDURE dbo.usp_GetEntryID
@EntryID INT
AS BEGIN
SET NOCOUNT ON;
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM dbo.table1 --<-- your table
WHERE EntryID = @EntryID
GROUP BY EntryID
RETURN 0
END
SP:
DECLARE @temp TABLE
(
EntryID INT
, Name NVARCHAR(50)
, Qty INT
)
INSERT INTO @temp (EntryID, Name, qty)
VALUES
(12, 'Global' , 5),
(12, 'In Europe' , 15),
(12, 'In Asia' , 21),
(12, 'In US' , 53),
(18, 'Max' , 5),
(18, 'In Europe' , 35),
(18, 'In Asia' , 63),
(18, 'In US' , 85)
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM @temp
GROUP BY EntryID
EntryID In Europe In Asia In US Global
----------- ----------- ----------- ----------- -----------
12 15 21 53 5
18 35 63 85 0
CREATE PROCEDURE dbo.usp_GetEntryID
@EntryID INT
AS BEGIN
SET NOCOUNT ON;
SELECT
EntryID
, [In Europe] = SUM(CASE WHEN Name = 'In Europe' THEN Qty ELSE 0 END)
, [In Asia] = SUM(CASE WHEN Name = 'In Asia' THEN Qty ELSE 0 END)
, [In US] = SUM(CASE WHEN Name = 'In US' THEN Qty ELSE 0 END)
, [Global] = SUM(CASE WHEN Name = 'Global' THEN Qty ELSE 0 END)
FROM dbo.table1 --<-- your table
WHERE EntryID = @EntryID
GROUP BY EntryID
RETURN 0
END
创建过程dbo.usp\u GetEntryID
@EntryID INT
作为开始
不计数;
挑选
入口标识
,[在欧洲]=总和(当名称='在欧洲',则数量0结束时)
,[在亚洲]=总和(如果名称为“在亚洲”,则数量为0结束)
,[In-US]=总和(如果名称为'In-US',则数量为0结束)
,[Global]=总和(当名称为'Global'时,则为0结束)
从dbo.table1--尝试以下操作:
这是动态查询,不需要在任何地方提及列名
CREATE PROC sp_Sample
@EntryID int
As
BEGIN
SET NOCOUNT ON
DECLARE @cols varchar(100)
DECLARE @Query varchar(1000)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from sample where [Entry Id]=@EntryID
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT [Entry ID],' + @cols + ' from
(
SELECT [Entry ID],[Name],[Qty]
FROM sample WHERE [Entry Id]='+cast(@EntryID as varchar(5))+'
) x
pivot
(
min(qty)
for name in (' + @cols + ')
) p '
EXECUTE(@query)
END
exec sp_Sample 18
你试过什么吗?..检查一下这个链接:它正是你所需要的。@Maurizio--它与你在这个问题上引用的链接完全不同