34,837
社区成员




CREATE TABLE TB(TID VARCHAR(5),CLASSID VARCHAR(5),KINDID VARCHAR(5),PRICE NUMERIC(9,2))
INSERT INTO TB
SELECT '01','1','A',92.10 UNION ALL
SELECT '01','2','C',10.00 UNION ALL
SELECT '01','1','A',1.00 UNION ALL
SELECT '02','2','E',8.10
go
DECLARE @s NVARCHAR(2000),@i NVARCHAR(2)
SET @s='select TID'
SELECT @s=@s+',[KINDID'+RTRIM(CLASSID)+']=max(case when CLASSID='+RTRIM(CLASSID)+' then KINDID else '''' end),[PRICE'+RTRIM(CLASSID)+']=sum(case when CLASSID='+RTRIM(CLASSID)+' then PRICE else 0 end)'
FROM TB GROUP BY CLASSID
exec (@s+' from TB group by TID')
/*
TID KINDID1 PRICE1 KINDID2 PRICE2
01 A 93.10 C 10.00
02 0.00 E 8.10
*/
DECLARE @TB TABLE (TID VARCHAR(5),CLASSID VARCHAR(5),KINDID VARCHAR(5),PRICE NUMERIC(9,2))
INSERT INTO @TB
SELECT '01','1','A',92.10 UNION ALL
SELECT '01','2','C',10.00 UNION ALL
SELECT '01','1','A',1.00 UNION ALL
SELECT '02','2','E',8.10
SELECT
TID,
[1_KIND]=max(CASE WHEN CLASSID=1 THEN KINDID ELSE '' end),
[1_PRICE]=max(CASE WHEN CLASSID=1 THEN price ELSE 0 end),
[2_KIND]=max(CASE WHEN CLASSID=2 THEN KINDID ELSE '' end),
[2_PRICE]=max(CASE WHEN CLASSID=2 THEN price ELSE 0 END)
FROM
(
SELECT TID,CLASSID,KINDID,SUM(PRICE) AS price FROM
@TB GROUP BY TID,CLASSID,KINDID
)a GROUP BY TID
/*
TID 1_KIND 1_PRICE 2_KIND 2_PRICE
----- ------ --------------------------------------- ------ ---------------------------------------
01 A 93.10 C 10.00
02 0.00 E 8.10
*/
SELECT
TID,
max(CASE WHEN CLASSID=1 THEN KINDID ELSE '' END) AS [1_KIND],
max(CASE WHEN CLASSID=1 THEN PRICE ELSE 0 END) AS [1_PRICE],
max(CASE WHEN CLASSID=2 THEN KINDID ELSE '' END) AS [2_KIND],
max(CASE WHEN CLASSID=2 THEN PRICE ELSE 0 END) AS [2_PRICE]
FROM (SELECT TID,CLASSID,KINDID,SUM(PRICE) AS PRICE FROM @TB GROUP BY TID,CLASSID,KINDID)t
GROUP BY TID
DECLARE @TB TABLE (TID VARCHAR(5),CLASSID VARCHAR(5),KINDID VARCHAR(5),PRICE NUMERIC(9,2))
INSERT INTO @TB
SELECT '01','1','A',92.10 UNION ALL
SELECT '01','2','C',10.00 UNION ALL
SELECT '01','1','A',1.00 UNION ALL
SELECT '02','2','E',8.10
select tid,
max(case when classid=1 then kindid else '' end)[1_KIND],
SUM(case when classid=1 then price else 0 end)[1_PRICE],
max(case when classid=2 then kindid else '' end)[2_KIND],
SUM(case when classid=2 then price else 0 end)[2_PRICE]
from @TB
group by tid
/*
tid 1_KIND 1_PRICE 2_KIND 2_PRICE
----- ------ --------------------------------------- ------ ---------------------------------------
01 A 93.10 C 10.00
02 0.00 E 8.10
(2 行受影响)
*/