动态和静态数据透视SQL服务器表

时间:2014-05-25 15:08:07

标签: sql dynamic static sql-server-2012 pivot-table

早上好。我做了桌子

CREATE TABLE zwierze2 (
id_zwierze INT PRIMARY KEY,
imie VARCHAR(15) NOT NULL CHECK(LEN(imie)>3),
rasa VARCHAR(30) NOT NULL,
wiek CHAR(2) NOT NULL,
rodzaj VARCHAR(30) NOT NULL,
);

与前。输入:

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(1, 'Alik', 'amstaf', 4, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(2, 'Alika', 'amstaf', 6, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(3, 'Killer', 'jamnik', 4, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(4, 'Thor', 'dachowiec', 4, 'kot');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(5, 'Randi', 'kundel', 4, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(6, 'Hamer', 'amstaf', 8, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(7, 'Bobik', 'jamnik', 4, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(8, 'Deral', 'jamnik', 6, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(9, 'Doge', 'jamnik', 7, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(10, 'Dogeł', 'amstaf', 9, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(11, 'Szak', 'amstaf', 10, 'pies');

INSERT INTO zwierze2(id_zwierze, imie, rasa, wiek, rodzaj)
VALUES(12, 'Pies', 'kundel', 14, 'pies');

在结果中,我希望得到一个包含列&rasa'的表格,每行都有一行' wiek' 并计算了多少amstaf在确切的wiek =' 10'等

我编码:

SELECT 4, 6, 7, 8, 9, 10, 14, rasa FROM zwierze2
PIVOT (
COUNT(rasa) FOR
wiek IN ([4],[6],[7],[8],[9],[10],[14]))
AS ilosc_psow_danej_rasy_w_danym_wieku

我没有很好地编码,它不起作用。 我还需要它的动态版本,但已经堆叠在这里。

修改 找到另一个断点,现在处于动态。我不会得到独特的rasa。

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
+ QUOTENAME(wiek)
FROM (SELECT DISTINCT wiek from zwierze) as wiek

SET @DynamicPivotQuery=
N'SELECT rasa, ' + @ColumnName +'
FROM zwierze
PIVOT(Count(id_zwierze)
FOR wiek IN (' + @ColumnName + ')) AS PVTTable'

EXEC(@DynamicPivotQuery);

1 个答案:

答案 0 :(得分:1)

鉴于您希望包含rasa的数据透视图作为列,您不能将其用作数据透视表中的聚合函数。

另请注意,SELECT 1,2,3 ...将选择文字值,而不是枢轴列。使用[]来逃避这一点。您可能需要以下内容:

SELECT [4], [6], [7], [8], [9], [10], [14], rasa 
FROM
(
  SELECT rasa, wiek, id_zwierze
  FROM zwierze2
 ) x
PIVOT 
(
  COUNT(id_zwierze) FOR
  wiek IN ([4],[6],[7],[8],[9],[10],[14]))
  AS ilosc_psow_danej_rasy_w_danym_wieku

SqlFiddle here

执行此操作的示例dynamically here