Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在存储过程中合并值?_Sql Server_Tsql_Stored Procedures_Group By - Fatal编程技术网

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--它与你在这个问题上引用的链接完全不同