【问题标题】:Dynamic and static pivot SQL server table动态和静态数据透视 SQL 服务器表
【发布时间】:2014-05-25 15:08:06
【问题描述】:

早上好。我做了桌子

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”的行 并计算出确切的 wiek='10' 等有多少 amstaf。

我编码:

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);

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • @StuarLC 我可以多用你的帮助吗?也没有管理动态......
    • 只需将 FROM 包装在另一个派生表 like this 中 - 发生的情况是发送到 PIVOT 的数据具有像 imie 这样的“隐藏”列,从而防止崩溃。您还可以在派生表中执行 GROUP by 以确保。
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2016-07-29
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多